從RN端發(fā)送消息到iOS端的過(guò)程:
iOS端在想給RN端調(diào)用的類(lèi)文件中使用宏定義RCT_EXPORT_MODULE()
導(dǎo)出這個(gè)類(lèi),并且使用宏定義RCT_EXPORT_METHOD()
導(dǎo)出想給RN端調(diào)用的類(lèi)方法,再遵守RCTBridgeModule
協(xié)議,方法的實(shí)現(xiàn)是寫(xiě)在iOS端的,這樣RN端通過(guò)調(diào)用這個(gè)方法就可以將想傳遞的參數(shù)傳到iOS端
iOS端代碼:
@implementation ExampleInterface
RCT_EXPORT_MODULE(); //可以指定一個(gè)參數(shù)來(lái)訪問(wèn)這個(gè)模塊,不指定就是這個(gè)類(lèi)的名字(ExampleInterface)
RCT_EXPORT_METHOD(sendMessage:(NSString *)msg){
NSLog(@"從RN端接收到的信息%@",msg);
}
RN端代碼:
//原生端RCT_EXPORT_MODULE()導(dǎo)出的類(lèi)
let ExampleInterface = require('react-native').NativeModules.ExampleInterface
ExampleInterface.sendMessage('{\"msgType\":\"pickContact\"}')
從iOS端發(fā)送消息到RN端:
iOS發(fā)送消息到RN端分為2種情況,一種是接收到RN端的消息,處理完畢后返回,另外一種是主動(dòng)發(fā)送消息到RN端,對(duì)于第一種通常是使用Promise機(jī)制,第二種RN端使用的NativeAppEventEmitter
接收器,iOS端通過(guò)eventDispatcher
發(fā)送
情況一 iOS端代碼:
@implementation ExampleInterface
RCT_EXPORT_MODULE(); //可以指定一個(gè)參數(shù)來(lái)訪問(wèn)這個(gè)模塊,不指定就是這個(gè)類(lèi)的名字(ExampleInterface)
RCT_EXPORT_METHOD(sendMessage:(NSString *)msg,resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject){
NSLog(@"從RN端接收到的信息%@",msg);
NSString *msgAdd = [msg stringByAppendingString:@"123"]; //對(duì)接收到的信息進(jìn)行處理
resolve(msgAdd); //通過(guò)此代碼塊回調(diào)到RN端
}
情況一 RN端代碼:
let ExampleInterface = require('react-native').NativeModules.ExampleInterface
ExampleInterface.sendMessage('{\"msgType\":\"pickContact\"}').then(
(result)=>{
console.log('原生端結(jié)果')
console.log(result)
}
).catch(
(error)=>{
console.log('錯(cuò)誤信息');
console.log(error)
console.log(error.message)
console.log(error.code)
console.log(error.nativeStackIOS);
console.log(error.nativeStackIOS.length)
}
)
情況二iOS端代碼:
@implementation ExampleInterface
@synthesize bridge = _bridge;
RCT_EXPORT_MODULE(); //可以指定一個(gè)參數(shù)來(lái)訪問(wèn)這個(gè)模塊,不指定就是這個(gè)類(lèi)的名字(ExampleInterface)
-(void)sendMessageToRN{
[self.bridge.eventDispatcher sendAppEventWithName@"NativeModuleMsg" body:@"原生消息"];
}
情況二RN端代碼:
NativeAppEventEmitter.addListener('NativeModuleMsg', (reminder)=>{ //監(jiān)聽(tīng)的事件的名稱(chēng)(NativeModuleMsg)和原生端發(fā)送的要一樣
console.log('原生端的消息'+reminder);
})