废话不多说,直接上问题:
1.如何拼接请求头?
1 | //申明返回的结果是json类型 |
2.如何返回参数在调用的同一方法中?
block,参数带有block去实现
1 | __block NSString *longitude; // __block,静态变量 |
废话不多说,直接上问题:
1.如何拼接请求头?
1 | //申明返回的结果是json类型 |
2.如何返回参数在调用的同一方法中?
block,参数带有block去实现
1 | __block NSString *longitude; // __block,静态变量 |
说说最近项目的一些感想吧。
###一、RN的创意
RN其实我觉得是一个很有创意的想法。不知道各位写RN项目的时候,有没有打开Xcode看过app的层级关系,我发现RN的这个想法,真的很有创意。
作为一名原生的开发,一直都是一个控制器上放一个View,然后在这个底层的View上添加UI控件,当需要一个新的视图的时候,创建一个新的视图控制器,再放新的View。
###重点来了!RN并不是这么做的

RN是将App创建的时候生成的根视图控制器,也就是底层的视图控制器,作为根本,然后通过JS文件写的视图,也就是View,不停的增加在这个rootViewCtrl上,进行覆盖替换。
###二、Text的区别
或许有的兄弟还没遇到这个坑,假如使用图片或者其他背景色作为背景,往上添加Text标签的时候,安卓默认为透明背景色,但是苹果默认为灰白色。因此,在写App的时候,需要在Text的样式添加backgroundColor为transparent
1 | backgroundColor:'transparent', |
###三、原生与RN的通信
以前对原生与RN的通信不太了解。现在有了一些想法。
1.callback的通信方式,是会返回一个callback,这个callback是可以保存的,也就是说这个返回结果可以保存再用的。
2.promise,这个就比较有趣了,形象的说,这是个“通道”,RN的方法中,放一个promise的参数,在原生的module中,可以先定义几个promise的回调,在不同的地方用。
举个例子,我在RN中写几个方法。分别是:调用A方法,调用B方法,调用C方法,调用D方法。都是带Promise的。

(lz是iOS开发,iOS中可以先声明几个变量)在iOS的module中,可以先声明几个promise的回调。比如先声明
1 | RCTPromiseResolveBlock resolveA |
这四个回调的函数可以先声明,为什么会叫他通道,原因就是它其实可以这么理解,你将本来理解可能混乱的东西专一化,定义一个A方法成功的回调resolveA和一个A方法失败的回调rejectA,这两个回调只用于A方法。这么理解起来是不是清晰多了。因此可以理解为他是一个原生回调给RN的通信通道。
3.原生直接发消息,通过
1 | [self sendEventWithName:@"EventReminder" body:@{@"name": eventName}]; |
这种方式注意了,请使用单例。
报错信息:bridge is not set. This is probably because you’ve “
“explicitly synthesized the bridge in %@, even though it’s inherited “
“from RCTEventEmitter.
踩坑了。。。
我相信肯定有兄弟需要从原生的OC向RN主动发起事件。而且这种场景也很多,比如集成第三方的服务,通过代理回调获取结果发送给RN等等等等。。。
我将我遇到的坑总结一下吧。
先看下官网怎么写的


1.你是不是像官网一样,先写一个继承自RCTEventEmitter的对象,什么都不写,看看能不能运行?
答案是:并不能运行=。=你必须写实现,也就是以下这个方法
1 | //.m文件 |
2.你在使用发送文件,也就是
1 | [self sendEventWithName:@"消息名" body:参数]; |
运行这个方法的时候有没有崩溃啊=。=
崩溃的提示是不是
1 | bridge is not set. This is probably because you've " |
其实就是bridage为空。
这个时候你查这个报错提示是不是发现有人说在Appdelegate.m里把rootView的bridage赋给这个你创建的对象,然后你试了一下确实发出去了开始哈皮=。=
有时候用AFNetworking发送数据的时候会产生这种错误:
1 | Request failed: unacceptable content-type: text/html |

这是因为text/html这个方式AF中没有。。这种时候有两种方式解决
1.直接修改AF的文件:
AFURLResponseSerialization.m文件中大约226行处,将
1 | self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil]; |
修改为:
1 | self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html",nil]; |

此时便可以正常发送消息了。
不过不是很建议直接修改,比如你要封装sdk总不能直接把别人写的第三方封进来吧,一方面别人集成容易产生冲突,第二你的sdk体积会大很多。这时候可以采用第二种方式
2.在你发送的时候每次都添加

1 |
|
接上一篇无星的RN学习之旅(一)最后我给出了一个基础项目地址进行学习。
PS:我使用的是VSCode编译器和Xcode编译器
一、RN如何调用原生方法
1.在新建的项目中打开ios目录下的工程文件,同时使用VSCode打开项目目录。
新建NSObjec对象,名字任意,我这里叫RNruniOS
.h文件添加RCTBridgeModule.h头文件,RCTBridgeModule协议
1 | //RNruniOS.h文件 |
.m文件添加RCTConvert.h头文件,并添加相应宏
1 | //RNruniOS.m文件 |
2.在rn项目中的index.ios.js文件进行调用
1 | //RN调用iOS原生方法,定义一个变量 |
1 | //RN调用原生方法 |
通过xcode进行项目编译,点击相应按钮触发事件即可看见控制台打印输出log信息。
该小练习github地址:https://github.com/XingXiaoWu/RNruniOS
二、回调函数CallBack的使用
无星的RN学习之旅(一)-环境安装以及新建项目
无星的RN学习之旅(三)
无星的RN学习之旅(四)——通信、持久化存储、xcode打包
无星的RN学习之旅(五)-关于react-navigation多层级页面返回时,去掉逐层推出动画
无星的RN学习之旅(六)-第三方App跳转,苹果商店跳转,loading框
iOS菜鸟,本周开始了react native的学习。
(一)环境安装
官网写的很详细,我觉得就没必要重新再啰嗦了。
官网地址:
http://reactnative.cn/docs/0.46/getting-started.html
(二)新建第一个项目
1.打开“终端”输入
1 | react-native init MyApp --version 0.44.3 |
注意:init命令默认会创建最新的版本,而目前最新的0.45及以上版本需要下载boost库编译。此库体积庞大,在国内即便翻墙也很难下载成功,导致很多人无法正常运行iOS项目,推荐暂时使用0.44.3的版本。
2.创建成功后cd到项目路径下
1 | cd MyApp |
3.运行该项目
1 | react-native run-ios |
P.S 我是运行iOS,如果运行安卓就输入
1 | react-native run-android |
我创建了一个练习文件,可供练习,这五个练习完成应该就能初步知道怎么交互了。包括我的学习路线怎么完成也会慢慢更新~

地址是:https://github.com/XingXiaoWu/React-Native-First
不如随手点个star让楼主也开心一整天~
这个是一些小坑,大牛们忽略。
1.有些时候,后台传输一些json数据会是Unicode码,如果存在在数组里,就更尴尬了,无法转成数组,那么这时候怎么办呢。

这时候,一定要把\U转换成\u,转换成功即可正常使用。
2.如何判断属于什么类型。
数据属于什么类型,使用iskindofclass来进行判断

3.如何将json串转换成dic或array
如果json数据正常,直接使用如图方法,如json数据为单引号,则进行转义。

1 | NSString *arrString = [jsonDic valueForKey:@"XXX"]; |
1 | #pragma mark -- 将JSON串转化为NSDictionary或NSArray |

1 | HashMapreMap =newHashMap(); |
问题:
存在这么一种情况:
我们要打包的android项目中已经引用了一个或多个第三方.jar文件。那么我们按上面的方法打成.jar文件,在引入到别的项目中使用中,
会发现出现错误:
NoClassDefFoundError
定位到错误代码位置,会发现生成.jar文件的原始android项目中引用的第三方.jar文件中的类找不到。
这里可以猜测,使用上述方法将android项目打成.jar文件的过程中,并没有将android项目原来引用的第三方.jar文件也一起打入到新的.jar文件中。
可以测试一下,将android项目打成的.jar文件解压缩,会发现只有java代码相关文件,而没有原来android项目中引用的第三方.jar文件
解决方案:
1、首先 问题产生的原因就是生成.jar文件的android项目原先引用的第三方.jar文件没有被打入到 新的.jar文件中