无星的RN学习之旅(三)-bridge is not set.

报错信息: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
官网介绍2.png

1.你是不是像官网一样,先写一个继承自RCTEventEmitter的对象,什么都不写,看看能不能运行?
答案是:并不能运行=。=你必须写实现,也就是以下这个方法

//.m文件
- (NSArray<NSString *> *)supportedEvents
{
  return @[@"EventReminder"];
}

2.你在使用发送文件,也就是

[self sendEventWithName:@"消息名" body:参数];

运行这个方法的时候有没有崩溃啊=。=
崩溃的提示是不是

bridge is not set. This is probably because you've "
            "explicitly synthesized the bridge in %@, even though it's inherited "
            "from RCTEventEmitter.

其实就是bridage为空。
这个时候你查这个报错提示是不是发现有人说在Appdelegate.m里把rootView的bridage赋给这个你创建的对象,然后你试了一下确实发出去了开始哈皮=。=

这时候你会发现一个悲伤的事实,不管你在RN里怎么写监听,你都监听不到这个事件=。=
那么正确的解法是什么呢=。=
(1)必须使用单例
(2)必须复写alloczone
其实就是加这么一段代码:

//.m文件
+(id)allocWithZone:(NSZone *)zone {
  static RNBridge *sharedInstance = nil;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    sharedInstance = [super allocWithZone:zone];
  });
  return sharedInstance;
}

在APPdelegate中就不需要将rootView的bridge赋予原生模块了。
用self进行发送即可
RN中使用NativeEventEmitter进行监听即可。
还有问题简书私信我,一起交流解决=。=

2017-12-22更新

还是有兄弟对于iOS与RN的交互有问题,直接上代码吧。图片名会写明是在桥接类的.h还是.m文件的代码


.h.png
.m.png
.m.png
.m.png

接下来是js方面如何监听

js.png
js.png

这里要注意了,下面这幅截图中的代码,如果使用DevicceEventEmitter无法监听到的话,用我图中写的对应自己原生模块的nativeBridgeEmitter(名字自取)去监听。


js.png

理论上,只要你的RN方面的服务以及模块已经启动,那就可以顺畅的进行oc的主动通信,不然是无法通信而且会导致崩溃的。

无星的RN学习之旅(一)-环境安装以及新建项目
无星的RN学习之旅(二)-RN与原生的通信
无星的RN学习之旅(四)——通信、持久化存储、xcode打包
无星的RN学习之旅(五)-关于react-navigation多层级页面返回时,去掉逐层推出动画
无星的RN学习之旅(六)-第三方App跳转,苹果商店跳转,loading框

推荐阅读更多精彩内容

  • 说说最近项目的一些感想吧。 一、RN的创意 RN其实我觉得是一个很有创意的想法。不知道各位写RN项目的时候,有没有...
    无星灬阅读 769评论 1 2
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 161,636评论 24 692
  • 导语 React Native是一套由 Facebook 开源的跨平台、动态更新的 Javascript 框架,其...
    滴嗒嗒阅读 7,964评论 5 36
  • 因为实习的原因,已经好久没有写博客了。倒不是因为忙,而是因为每天都被业务代码填满,找不到很好的可以拿来写博客的素材...
    陈添阅读 2,816评论 2 8
  • 今天的一个户外活动收获很多,先是第一个接一个坐在对方腿上,如果一个人不坚持就会从来,但是我们谁也不放弃,这就是我们...
    贺春阅读 130评论 0 0
  • 今天的题目,卖了个关子,我们说的是战胜拖延小妙招,分享文章来自剽悍晨读。 不知道大家有没有这种体验,不管是大任务、...
    开心就好_792c阅读 172评论 0 2
  • 果纶多小台芒非凯特贵妃当季时令水果芒果 小编推荐:新鲜芒果,现摘现发,坏果包赔,小巧饱满,果香四溢,肉质饱满,口感...
    546e78ac0914阅读 91评论 0 0
  • 每日一我 吃完了昨天做的银耳红枣羹。 每日一善 长风新村街道图书馆很不错,在枣阳路251弄100号。 每日一习 看...
    sophietyl阅读 58评论 0 0