報錯信息:bridge is not set. This is probably because you've "
"explicitly synthesized the bridge in %@, even though it's inherited "
"from RCTEventEmitter.
踩坑了蜀细。瓜浸。淋纲。
我相信肯定有兄弟需要從原生的OC向RN主動發(fā)起事件刽射。而且這種場景也很多屈芜,比如集成第三方的服務(wù)拍棕,通過代理回調(diào)獲取結(jié)果發(fā)送給RN等等等等揪荣。宇葱。瘦真。
我將我遇到的坑總結(jié)一下吧。
先看下官網(wǎng)怎么寫的
1.你是不是像官網(wǎng)一樣黍瞧,先寫一個繼承自RCTEventEmitter的對象诸尽,什么都不寫,看看能不能運(yùn)行印颤?
答案是:并不能運(yùn)行=您机。=你必須寫實(shí)現(xiàn),也就是以下這個方法
//.m文件
- (NSArray<NSString *> *)supportedEvents
{
return @[@"EventReminder"];
}
2.你在使用發(fā)送文件年局,也就是
[self sendEventWithName:@"消息名" body:參數(shù)];
運(yùn)行這個方法的時候有沒有崩潰啊=际看。=
崩潰的提示是不是
bridge is not set. This is probably because you've "
"explicitly synthesized the bridge in %@, even though it's inherited "
"from RCTEventEmitter.
其實(shí)就是bridage為空。
這個時候你查這個報錯提示是不是發(fā)現(xiàn)有人說在Appdelegate.m里把rootView的bridage賦給這個你創(chuàng)建的對象矢否,然后你試了一下確實(shí)發(fā)出去了開始哈皮=仿村。=
這時候你會發(fā)現(xiàn)一個悲傷的事實(shí),不管你在RN里怎么寫監(jiān)聽兴喂,你都監(jiān)聽不到這個事件=蔼囊。=
那么正確的解法是什么呢=。=
(1)必須使用單例
(2)必須復(fù)寫alloczone
其實(shí)就是加這么一段代碼:
//.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進(jìn)行發(fā)送即可
RN中使用NativeEventEmitter進(jìn)行監(jiān)聽即可畏鼓。
還有問題簡書私信我,一起交流解決=壶谒。=
2017-12-22更新
還是有兄弟對于iOS與RN的交互有問題云矫,直接上代碼吧。圖片名會寫明是在橋接類的.h還是.m文件的代碼
接下來是js方面如何監(jiān)聽
這里要注意了汗菜,下面這幅截圖中的代碼让禀,如果使用DevicceEventEmitter無法監(jiān)聽到的話挑社,用我圖中寫的對應(yīng)自己原生模塊的nativeBridgeEmitter(名字自取)去監(jiān)聽巡揍。
理論上痛阻,只要你的RN方面的服務(wù)以及模塊已經(jīng)啟動,那就可以順暢的進(jìn)行oc的主動通信腮敌,不然是無法通信而且會導(dǎo)致崩潰的阱当。
無星的RN學(xué)習(xí)之旅(一)-環(huán)境安裝以及新建項(xiàng)目
無星的RN學(xué)習(xí)之旅(二)-RN與原生的通信
無星的RN學(xué)習(xí)之旅(四)——通信、持久化存儲糜工、xcode打包
無星的RN學(xué)習(xí)之旅(五)-關(guān)于react-navigation多層級頁面返回時弊添,去掉逐層推出動畫
無星的RN學(xué)習(xí)之旅(六)-第三方App跳轉(zhuǎn),蘋果商店跳轉(zhuǎn)捌木,loading框