电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

詳解React Native與IOS端之間的交互

瀏覽:4日期:2022-09-16 16:09:38
目錄前置準備RN 傳值給 iOS方法 1 正常傳值給原生方法 2 傳遞回調函數方法 3 獲取 promise 回調方法 4 獲取 promise 的同步方式iOS 傳值給 RN 端初始的數據提供添加監聽事件總結前置準備

首先最好了解一點關于 oc 的語法知識

1.創建聲明文件nativeModule.h

#import <Foundation/Foundation.h>#import <React/RCTBridgeModule.h>@interface nativeModule : NSObject <RCTBridgeModule>@end

2.創建文件nativeModule.m

#import <Foundation/Foundation.h>#import 'nativeModule.h'@interface nativeModule ()@end@implementation nativeModule@end

詳解React Native與IOS端之間的交互

這是添加完文件后的結構目錄

關于 interface 的區別:

.h里面的@interface,它是供其它Class調用的。它的@property和functions,都能夠被其它Class“看到”(public)

而.m里面的@interface,在OC里叫作Class Extension,是.h文件中@interface的補充。但是.m文件里的@interface,對外是不開放的,只在.m文件里可見(private)

因此,我們將對外開放的方法、變量放到.h文件中,而將不想要對外開放的變量放到.m文件中(.m文件的方法可以不聲明,直接用)。

RN 傳值給 iOS方法 1 正常傳值給原生

在 .m 文件中添加方法:

// 省略上面的代碼@implementation nativeModule// 這句代碼是必須的 用來導出 module, 這樣才能在 RN 中訪問 nativeModule這個 moduleRCT_EXPORT_MODULE();// 接收字符串RCT_EXPORT_METHOD(addHelloWord:(NSString *)name location:(NSString *)location){ NSLog(@'%@,%@', name, location);}@end

RN 代碼:

import { Button, NativeModules } from ’react-native’const { nativeModule } = NativeModules<Button title={’傳 2 個參數給 native’} onPress={() => { nativeModule.addHelloWord(’你的名字’, ’位置:浙江’)}}/>

點擊此按鈕的作用,就是將 ’你的名字’, ’位置:浙江’ 這 2 個字符串傳遞到了原生端

方法 2 傳遞回調函數

在 .m 文件中添加:

// 只接受一個參數——傳遞給 JavaScript 回調函數的參數數組。RCT_EXPORT_METHOD(checkIsRoot:(RCTResponseSenderBlock)callback) { NSArray *array = @[@'string', @'number']; callback(array);}

在 RN 中添加代碼:

<Button title={’js 傳一個回調給 native,回調中收到一個數組’} onPress={() => { nativeModule.checkIsRoot((str: string, num: string) => { console.log(str, num) })}}/>

這是在 RN 中 給原生端傳遞了一個回調函數,用來解決,部分操作完成后的回調, ** 如果 callback 多次調用 RN 會報錯 **

方法 3 獲取 promise 回調

在 .m 文件中添加代碼:

@interface nativeModule ()@property (nonatomic) RCTPromiseResolveBlock normalResolve;@property (nonatomic) RCTPromiseRejectBlock normalReject;@property (nonatomic) NSInteger num;@end// 這是一個計時器-(void)startTime: (NSArray*) data{ NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2 repeats:YES block:^(NSTimer * _Nonnull timer) {NSArray *events =@[@'Promise ',@'test ',@' array']; if (events) { self.normalResolve(events); [timer invalidate]; } else { [timer invalidate]; NSError *error=[NSError errorWithDomain:@'我是回調錯誤信息...' code:101 userInfo:nil]; self.normalReject(@'no_events', @'There were no events', error); } }]; [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];}// 回調給RN的參數,回調的錯誤信息RCT_EXPORT_METHOD(getHBDeviceUniqueID: (RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { // 要執行的任務 self.normalResolve = resolve; self.normalReject = reject; [self performSelectorOnMainThread:@selector(startTime:) withObject: [NSArray arrayWithObjects: @'1', @'2', nil] waitUntilDone:YES];}

在 RN 中添加代碼:

<Button title={’native傳一個 promise 給 JS’} onPress={() => { nativeModule.getHBDeviceUniqueID().then((arr: string[]) => { console.log(’resolve’, arr) }).catch((err: string) => { console.error(err) })}}/>

nativeModule.getHBDeviceUniqueID 的執行他是一個 promise,可以獲取原生端的回調, 其實和方法 2 差不多

方法 4 獲取 promise 的同步方式

在 .m 文件中添加:

// 這是一個計時器2-(void)startTime2: (NSArray*) data{ NSLog(@'data%@',data); NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {NSLog(@'%d', (int)self.num);self.num = self.num + 1;NSLog(@'%d', (int)self.num);if (self.num > 4) { [timer invalidate]; NSLog(@'end'); self.normalResolve(data); } }]; [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];}// RCT_REMAP_METHOD 與RCT_EXPORT_METHOD相同,但是該方法是在JS線程上從JS同步調用的,可能會返回結果。// 同步可能會有性能問題 建議除了 promise 以外都別使用RCT_REMAP_METHOD(findEvents, findEventsWithResolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject){ self.normalResolve = resolve; self.normalReject = reject; self.num = 0; [self performSelectorOnMainThread:@selector(startTime2:) withObject: [NSArray arrayWithObjects: @'1', @'2', nil] waitUntilDone:YES];}

在 RN 端添加代碼:

<Button title={’native傳一個 promise 給 JS2’} onPress={() => { nativeModule.findEvents().then((arr: string[]) => { console.log(’resolve’, arr) }).catch((err: string) => { console.error(err) })}}/>

方法 4 和方法 3 大體一致,但是有一點不同,就是 RCT_REMAP_METHOD 使用此方法會將代碼變成同步狀態

iOS 傳值給 RN 端初始的數據提供

在 appDelegate.m 文件中添加代碼:

NSArray *imageList = @[@'http://foo.com/bar1.png',@'http://foo.com/bar2.png'];NSDictionary *props = @{@'images' : imageList};RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge moduleName:@'learn' initialProperties:props];// 這一行代碼原本就有,不同點在于 initialProperties:props

在 RN 端寫入:

// 重寫 APP , images就是 iOS 提供的數據,這里我們通過 context 來傳遞數據export default class App extends React.Component<{ images: string[] }> { render() { return <NativeProps.Provider value={this.props.images}> <AppContainer/> </NativeProps.Provider> }}// 在 hooks 里簡單的使用const images = useContext(NativeProps);<Text>這是從 native 端傳來的初始數據{JSON.stringify(images)}</Text>添加監聽事件

在 .m 文件中添加代碼:

// 可供監聽的事件名稱- (NSArray<NSString *> *)supportedEvents{ return @[@'EventReminder'];}RCT_EXPORT_METHOD(postNotificationEvent:(NSString *)name){ NSLog(@'calendarEventReminderReceived'); [self sendEventWithName:@'EventReminder' body:@{@'name': name}];;}- (void)calendarEventReminderReceived:(NSNotification *)notification{ // 這是官網的例子 NSLog(@'calendarEventReminderReceived'); NSString *eventName = notification.userInfo[@'name']; [self sendEventWithName:@'EventReminder' body:@{@'name': eventName}];}RCT_EXPORT_METHOD(Send){ NSDictionary *dict = @{@'name' : @'veuimyzi'}; NSNotification *notification = [[NSNotification alloc] initWithName:@'EventReminder' object:nil userInfo:dict] ; [self calendarEventReminderReceived:notification];}

在 RN 中添加代碼:

const ManagerEmitter = new NativeEventEmitter(nativeModule)const [msg, setMsg] = useState([])// hooks 中的使用,類似于 componentDidMount 生命周期useEffect(() => { const subscription = ManagerEmitter.addListener( ’EventReminder’, (reminder) => {setMsg(prevState => { return prevState.concat(reminder.name)})console.log(’這是監聽的EventReminder事件回復’, reminder.name) } ) return () => { subscription.remove() }}, [])<Button title={’js 監聽事件,讓 native 給 js 發通知’} onPress={() => { nativeModule.postNotificationEvent(’test’)}}/><Button title={’js 監聽事件,讓 native 給 js 發通知 send’} onPress={() => { nativeModule.Send()}}/>{ msg.map((item, index) => { return <Text key={item + index}>item:{item}</Text> })}

關于 postNotificationEvent 方法是屬于最簡單的使用, 在原生端調用 sendEventWithName 就可以傳遞數據給 RN 的監聽

而另一個方法 Send 和 calendarEventReminderReceived ,一個是來自于官網的實例 講的是從 NSNotification獲取數據, Send 是傳遞數據給 calendarEventReminderReceived

關于監聽的優化, 這個官網上也有,有空可以看下,就是在 .m 文件中添加下列代碼:

@implementation nativeModule{ bool hasListeners; // 一個局部變量}-(void)startObserving { hasListeners = YES;}-(void)stopObserving { hasListeners = NO;}// 在發送監聽的添加判斷,如果有監聽才發送,有效減少橋接代碼的調用if (hasListeners) { [self sendEventWithName:@'EventReminder' body:@{@'name': name}];;}總結

上述代碼的庫: https://github.com/Grewer/learn-rn

關于原生端和 RN 端的交互基本就是這些了,當然原生端還有更多,更復雜的操作,比如進程什么的,如果想寫橋接方法,這個也會碰到很多,不過掌握了上面這些,對于一些三方 SDK 的調用是夠用了

以上就是詳解React Native與IOS端之間的交互的詳細內容,更多關于React Native與IOS端之間的交互的資料請關注好吧啦網其它相關文章!

標簽: IOS
相關文章:
主站蜘蛛池模板: 破碎机_上海破碎机_破碎机设备_破碎机厂家-上海山卓重工机械有限公司 | 铝机箱_铝外壳加工_铝外壳厂家_CNC散热器加工-惠州市铂源五金制品有限公司 | 气力输送设备_料封泵_仓泵_散装机_气化板_压力释放阀-河南锐驰机械设备有限公司 | 球磨机 选矿球磨机 棒磨机 浮选机 分级机 选矿设备厂家 | 大型冰雕-景区冰雕展制作公司,3D创意设计源头厂家-[赛北冰雕] | 电动球阀_不锈钢电动球阀_电动三通球阀_电动调节球阀_上海湖泉阀门有限公司 | ORP控制器_ORP电极价格-上优泰百科| 上海电子秤厂家,电子秤厂家价格,上海吊秤厂家,吊秤供应价格-上海佳宜电子科技有限公司 | 宁夏活性炭_防护活性炭_催化剂载体炭-宁夏恒辉活性炭有限公司 | vr安全体验馆|交通安全|工地安全|禁毒|消防|安全教育体验馆|安全体验教室-贝森德(深圳)科技 | 尊享蟹太太美味,大闸蟹礼卡|礼券|礼盒在线预订-蟹太太官网 | 嘉兴恒升声级计-湖南衡仪声级计-杭州爱华多功能声级计-上海邦沃仪器设备有限公司 | SPC工作站-连杆综合检具-表盘气动量仪-内孔缺陷检测仪-杭州朗多检测仪器有限公司 | 锥形螺带干燥机(新型耙式干燥机)百科-常州丰能干燥工程 | 保温杯,儿童婴童奶瓶,运动水壶「广告礼品杯定制厂家」超朗保温杯壶 | 便携式谷丙转氨酶检测仪|华图生物科技百科 | 炭黑吸油计_测试仪,单颗粒子硬度仪_ASTM标准炭黑自销-上海贺纳斯仪器仪表有限公司(HITEC中国办事处) | 镀锌钢格栅_热镀锌格栅板_钢格栅板_热镀锌钢格板-安平县昊泽丝网制品有限公司 | SDG吸附剂,SDG酸气吸附剂,干式酸性气体吸收剂生产厂家,超过20年生产使用经验。 - 富莱尔环保设备公司(原名天津市武清县环保设备厂) | TwistDx恒温扩增-RAA等温-Jackson抗体-默瑞(上海)生物科技有限公司 | Win10系统下载_32位/64位系统/专业版/纯净版下载 | 渣土车电机,太阳能跟踪器电机,蜗轮蜗杆减速电机厂家-淄博传强电机 | 压砖机、液压制砖机、静压砖机、环保砖机生产厂家—杜甫机械 | 环比机械| 运动木地板_体育木地板_篮球馆木地板_舞台木地板-实木运动地板厂家 | 深圳彩钢板_彩钢瓦_岩棉板_夹芯板_防火复合彩钢板_长鑫 | 废气处理_废气处理设备_工业废气处理_江苏龙泰环保设备制造有限公司 | 自进式锚杆-自钻式中空注浆锚杆-洛阳恒诺锚固锚杆生产厂家 | 交联度测试仪-湿漏电流测试仪-双85恒温恒湿试验箱-常州市科迈实验仪器有限公司 | 杭州实验室尾气处理_实验台_实验室家具_杭州秋叶实验设备有限公司 | 连续油炸机,全自动油炸机,花生米油炸机-烟台茂源食品机械制造有限公司 | 长春网站建设,五合一网站设计制作,免费优化推广-长春网站建设 | 石家庄网站建设|石家庄网站制作|石家庄小程序开发|石家庄微信开发|网站建设公司|网站制作公司|微信小程序开发|手机APP开发|软件开发 | 合肥风管加工厂-安徽螺旋/不锈钢风管-通风管道加工厂家-安徽风之范 | 暖气片十大品牌厂家_铜铝复合暖气片厂家_暖气片什么牌子好_欣鑫达散热器 | 臭氧实验装置_实验室臭氧发生器-北京同林臭氧装置网 | 运动木地板_体育木地板_篮球馆木地板_舞台木地板-实木运动地板厂家 | 制氮设备-变压吸附制氮设备-制氧设备-杭州聚贤气体设备制造有限公司 | 内窥镜-工业内窥镜厂家【上海修远仪器仪表有限公司】 | CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 |