日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

React?Native與iOS?OC之間的交互示例詳解

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

首先最好了解一點關于 oc 的語法知識,不然很多都是看不懂的

創建聲明文件 nativeModule.h

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

創建文件 nativeModule.m

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

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

關于 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 差不多

方法 3 獲取 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/lea...

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

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

標簽: JavaScript
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美伊人久久| 国产成人久久精品一区二区三区| 久久影院午夜精品| 国产精品一国产精品k频道56| 日韩影片在线观看| 男女男精品网站| 日本欧美在线看| 日本一区二区三区视频在线看| 亚洲欧美网站在线观看| 日本亚洲视频在线| 国产日韩欧美一区在线| 国产高清精品二区| 成人精品视频| 欧美1级日本1级| 国产偷自视频区视频一区二区| 美女黄网久久| 日韩精品中文字幕一区二区| 日本久久二区| 久久精品国产一区二区| 色在线视频观看| 欧美日韩在线二区| 丝袜美腿高跟呻吟高潮一区| 日本电影久久久| 国产91在线精品| 91精品一区国产高清在线gif| 黄色亚洲在线| 综合亚洲视频| 国产精品99久久免费| 在线天堂资源www在线污| 欧美一区二区性| 综合激情视频| 久久精品国内一区二区三区| 99免费精品| 日韩一区二区三免费高清在线观看| 国产精品美女在线观看直播| 水蜜桃精品av一区二区| 女同性一区二区三区人了人一 | 日本少妇一区| 久久成人亚洲| 久久亚州av| 中文在线一区| 国产精成人品2018| 久久精品卡一| 日韩中文av| 特黄毛片在线观看| 伊人久久大香伊蕉在人线观看热v| 国产精品一区二区三区av| 日韩欧美午夜| 中文国产一区| 国产激情久久| 中文欧美日韩| 久久精品国内一区二区三区| 99亚洲精品| 久久精品免费看| 天堂资源在线亚洲| 国产精品成人国产| 在线亚洲激情| 成人国产精品| 无码日韩精品一区二区免费| 亚洲伦乱视频| 国产午夜一区| 尹人成人综合网| 精品亚洲a∨一区二区三区18| 亚洲二区三区不卡| 久久中文字幕一区二区| 99视频一区| 国产一区二区三区国产精品| 综合亚洲视频| 亚洲精品国产嫩草在线观看 | 日本不卡中文字幕| 久久人人97超碰国产公开结果| 色综合视频一区二区三区日韩 | 中文字幕av亚洲精品一部二部| 老司机免费视频一区二区| 玖玖玖国产精品| 国产精品久久久久av电视剧| 欧美精品国产白浆久久久久| 9国产精品视频| 精品中文字幕一区二区三区 | 亚洲最大av| 国产一区日韩一区| 精品三级久久久| 日韩精品欧美精品| 亚洲精品小说| 国产黄大片在线观看| 欧美日一区二区在线观看| 99国产精品| 激情欧美一区| 亚洲深夜视频| 欧美黄页在线免费观看| 亚洲视频电影在线| 久久精品影视| 国产不卡精品| 国产精品红桃| 欧美日一区二区三区在线观看国产免 | 久久亚洲国产| 成人国产精品久久| 国产激情一区| 国产日韩欧美| 欧美日韩在线精品一区二区三区激情综合| 色综合www| 久久影视三级福利片| 欧美日韩精品一区二区三区视频| 另类av一区二区| 婷婷综合亚洲| 精品一区欧美| 亚洲福利国产| 久久精品不卡| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 日韩福利一区| 国产 日韩 欧美 综合 一区| 久久天堂影院| 久久精品二区亚洲w码| 国产情侣一区| 欧美天堂在线| 日韩精品欧美精品| 日本 国产 欧美色综合| 亚洲在线一区| 欧美专区18| 蜜臀久久99精品久久久画质超高清| 99精品综合| 欧美日韩国产高清电影| 另类中文字幕国产精品| 88xx成人免费观看视频库| 麻豆视频在线观看免费网站黄| 欧美精品不卡| 精品一区二区三区四区五区| 国产精品亚洲片在线播放| 日韩av网站免费在线| 日本在线不卡视频一二三区| 中文不卡在线| 蜜臀va亚洲va欧美va天堂| 999在线观看精品免费不卡网站| 在线精品视频在线观看高清| 五月精品视频| 视频精品一区二区| 亚洲综合婷婷| 欧美亚洲一区二区三区| 国产日韩欧美一区二区三区 | 综合激情网...| 婷婷五月色综合香五月| 亚洲青青久久| 97久久中文字幕| 国产三级一区| 精品高清久久| 加勒比视频一区| 亚洲精品在线影院| 亚洲欧美综合| 三级欧美在线一区| 亚洲人成网站在线在线观看| 日韩精品导航| 久久91视频| 久久久久国产精品一区三寸| 女主播福利一区| 伊人国产精品| 国产欧美日韩视频在线 | 久久99精品久久久久久园产越南 | 首页国产欧美久久| 日韩av在线免费观看不卡| 国产精品欧美大片| 91看片一区| 黄色精品网站| 日本午夜精品视频在线观看| 麻豆精品久久| 亚洲精品在线影院| 老牛影视一区二区三区| 97久久精品| 中文字幕高清在线播放| 亚洲二区免费| 日本电影久久久| 日韩成人精品一区| 国产精品亚洲一区二区三区在线观看| 在线视频免费在线观看一区二区| 日韩一区二区三免费高清在线观看| 你懂的亚洲视频| 久久影视一区| 欧美永久精品| 日韩三区在线| 日韩精品一二三区| 免费视频一区二区三区在线观看 | 在线日韩成人| 欧美激情aⅴ一区二区三区| 久久久国产精品一区二区中文| 午夜精品婷婷| 国产精品一区亚洲| 成人精品天堂一区二区三区| 免费在线看一区| 久久精品国产一区二区| 好吊一区二区三区| 国产高清视频一区二区| 日韩视频二区| 国产精品亚洲综合久久| 在线日韩av| 国产精品国码视频| 午夜欧美精品| 免费一区二区三区在线视频| 黄色亚洲在线| 国模大尺度视频一区二区| 亚洲五月婷婷| 里番精品3d一二三区|