RN調(diào)用原生方法状知,在原生方法中發(fā)送本地通知,接收到通知跳轉(zhuǎn)頁面孽查,要注意的是RN調(diào)用原生方法饥悴,會(huì)自動(dòng)開啟一個(gè)新的線程,并非在主線程卦碾,如果直接發(fā)送通知铺坞,那么push控制器的時(shí)候就會(huì)有很大的延時(shí),為了保證正常跳轉(zhuǎn)洲胖,通知應(yīng)該在主線程發(fā)送
1济榨、遵守RCTBridgeModule
協(xié)議
2、實(shí)現(xiàn)協(xié)議方法RCT_EXPORT_MODULE(導(dǎo)出模塊的模塊名)
這里的即是協(xié)議方法的實(shí)現(xiàn)绿映,也是OC模塊的導(dǎo)出
雖然這里的模塊名只是為了暴露給RN擒滑,但是還是需要給出有一定意義的名字方便區(qū)別腐晾,通常建議采用,導(dǎo)出OC模塊的類名
3丐一、導(dǎo)出供RN調(diào)用的方法
使用宏 RCT_EXPORT_METHOD
將要導(dǎo)出的方法包裹即可
//OC方法
- (void)Test
{
}
//導(dǎo)出寫成
RCT_EXPORT_METHOD(Test)
{
}
//OC方法帶參數(shù)
- (void)TestWithParams:(NSDictionary *)params
{
}
//導(dǎo)出寫成
RCT_EXPORT_METHOD(TestWithParams:(NSDictionary *)params)
{
}
//OC方法帶參數(shù)和RN回調(diào)
- (void)TestWithParams:(NSDictionary *)params RNCallBack:(RCTResponseSenderBlock)RNCallBack)
{
}
//導(dǎo)出寫成
RCT_EXPORT_METHOD(TestWithParams:(NSDictionary *)params RNCallBack:(RCTResponseSenderBlock)RNCallBack)
{
NSLog(@"參數(shù):%@",params);
NSArray *events = [[NSArray alloc] initWithObjects:@"張三", @"張三",nil];
if (RNCallBack)
{
RNCallBack(@[[NSNull null], events]);
}
}
RCTResponseSenderBlock
的聲明是
typedef void (^RCTResponseSenderBlock)(NSArray *response);
參數(shù)是一個(gè)數(shù)組藻糖,回調(diào)時(shí)當(dāng)作參數(shù)傳給RN,RN接收到后將數(shù)組的每一個(gè)元素都單獨(dú)當(dāng)作一個(gè)參數(shù)處理库车。也就是說如果RCTResponseSenderBlock
參數(shù)傳入@[參數(shù)1,參數(shù)2,...,參數(shù)n]巨柒,如果在RN端接收,形參列表應(yīng)該是(形參1,形參2,...,形參n)柠衍。通常情況下傳入兩個(gè)參數(shù)參數(shù)1(錯(cuò)誤信息洋满,沒有錯(cuò)誤就是[NSNull null])
和參數(shù)2(其他信息json結(jié)構(gòu)OC字典即可)
4、在RN中調(diào)用導(dǎo)出的OC方法
1)導(dǎo)入NativeModules
var { NativeModules } = require('react-native');
2)調(diào)用OC方法
格式:
第二步導(dǎo)出OC模塊的名.導(dǎo)出方法名(形參列表)
onPress={(error,events) => test1(error,events)}
function test1(error,events){
NativeModules.導(dǎo)出OC模塊的名.TestWithParams(
{name:'張超',age:'30',books:[{name:'java',price:'100'},{name:'java',price:'100'}]},
(error,events) => {console.log(events)});}