RN 端 與IOS原生的交互通信

最近在公司做一個 RN 項目, 其中因為對接了一些友盟推送等功能,于是需要和原生通信數(shù)據(jù),于是上網(wǎng)查了下,這類資料在網(wǎng)上已經(jīng)有許多了,在這就做個整理,也為自己加深印象

首先 RN 與 IOS 通信,在原生端需創(chuàng)建一個bridge ,并遵守<RCTBridgeModule>協(xié)議


#import <React/RCTBridgeModule.h>

@interface PushModule : NSObject<RCTBridgeModule>

其次,在@implementation中導(dǎo)出 Module,這里,當(dāng)導(dǎo)出 module,也就是RCT_EXPORT_MODULE()之后,RN 中引用這個 module,就會自動創(chuàng)建一個對象,IOS 原生這邊不要額外 alloc 或者 new 一個新對象

@implementation PushModule

RCT_EXPORT_MODULE()

然后 有幾種通信方式

  1. 定義導(dǎo)出的方法名
RCT_EXPORT_METHOD(pushEvent:(NSString *)event callback:(RCTResponseSenderBlock)callback){
  NSLog(@"----對React Native提供調(diào)用方法,Callback---%@",event);
  NSString *callbackData = @"原生數(shù)據(jù)被RN調(diào)用"; //準(zhǔn)備回調(diào)回去的數(shù)據(jù)
  callback(@[[NSNull null],callbackData]);
}

定義一個方法后,RN 就可通過NativeModules獲取到對于 Module后調(diào)用相應(yīng)方法,event是 RN 傳給 IOS 的值,IOS 這邊可通過 callback 這個 block 回調(diào)給 RN 數(shù)據(jù)

callBackEvent (){
NativeModules.PushModule.pushEvent(('RN->原生的數(shù)據(jù)'),(error, events) => {
if (error) {
console.log(error);
        }else {
alert(events)
}
})
}

  1. promise實現(xiàn)的回調(diào)函數(shù)
    這種,原生這邊區(qū)別不是很大, 但回調(diào) block 得使用特定的

static RCTPromiseResolveBlock _resolve;//成功回調(diào)
static RCTPromiseRejectBlock _reject;//失敗回調(diào)

RCT_REMAP_METHOD(pushPromisesEvent,
                 resolver:(RCTPromiseResolveBlock)resolve
                 rejecter:(RCTPromiseRejectBlock)reject){
  _resolve = resolve;
  _reject = reject;
 }

//異步回調(diào)函數(shù)

+(void) handleResult:(id)result{
  //原生Promises數(shù)據(jù)被RN調(diào)用
  if ([result isEqualToString:@"獲取數(shù)據(jù)成功"]) {
     _resolve(@[result]);
  }else{
    //返回錯誤信息
    NSError *error=[NSError errorWithDomain:result code:101 userInfo:nil];
       _reject(@"no_events", @"There were no events", error);
  }
}

RN 調(diào)用方法

NativeModules.PushModule.pushPromisesEvent().then((events)=>{
alert(events+1111)
}).catch((e)=>{
// alert(e)
        console.log("錯誤信息------"+e);
  })
}

  1. 還有一種就是通知模式, 與前兩者不同,IOS 原生 module 不僅要遵守協(xié)議,還要繼承RCTEventEmitter類
#import <React/RCTEventEmitter.h>
#import <React/RCTBridgeModule.h>
@interface PushModule : RCTEventEmitter<RCTBridgeModule>

在 .m 的實現(xiàn)中有幾個繼承方法需要實現(xiàn)

//IOS 回傳給 RN 的通知方法
- (NSArray*)supportedEvents{
  return @[@"Notice_name"]
}

- (void)startObserving
{
  [PushTool sharedPushTool].isReady = YES;
  [[NSNotificationCenter defaultCenter] addObserver:self
                                           selector:@selector(notice:)
                                               name:@"event-notice"
                                             object:nil];
}

-(void)notice:(NSNotification*)notification
{
  NSDictionary*obj = notification.object;
  [self sendEventWithName:@"Notice_name" body:obj];
}

在 RN 這邊添加監(jiān)聽

 var module   = new    NativeEventEmitter(NativeModules.PushModule)
module.addListener('Notice_name',(data)=>this.message(data));

之前 IOS 也可以和安卓那邊統(tǒng)一,使用DeviceEventEmitter來添加監(jiān)聽,但先好像已經(jīng)被遺棄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末熙参,一起剝皮案震驚了整個濱河市艳吠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌孽椰,老刑警劉巖昭娩,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異弄屡,居然都是意外死亡题禀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門膀捷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迈嘹,“玉大人,你說我怎么就攤上這事全庸⌒阒伲” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵壶笼,是天一觀的道長神僵。 經(jīng)常有香客問我,道長覆劈,這世上最難降的妖魔是什么戴差? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任胶坠,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘橄杨。我一直安慰自己腊尚,他們只是感情好喜每,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布间护。 她就那樣靜靜地躺著,像睡著了一般白筹。 火紅的嫁衣襯著肌膚如雪智末。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天徒河,我揣著相機(jī)與錄音系馆,去河邊找鬼。 笑死虚青,一個胖子當(dāng)著我的面吹牛它呀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播棒厘,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼纵穿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了奢人?” 一聲冷哼從身側(cè)響起谓媒,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎何乎,沒想到半個月后句惯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡支救,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年抢野,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片各墨。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡指孤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贬堵,到底是詐尸還是另有隱情恃轩,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布黎做,位于F島的核電站叉跛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蒸殿。R本人自食惡果不足惜筷厘,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宏所。 院中可真熱鬧酥艳,春花似錦、人聲如沸楣铁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盖腕。三九已至赫冬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間溃列,已是汗流浹背劲厌。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留听隐,地道東北人补鼻。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親风范。 傳聞我的和親對象是個殘疾皇子咨跌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355