iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >React Native与IOS端之间交互的示例分析
  • 715
分享到

React Native与IOS端之间交互的示例分析

2023-06-15 09:06:40 715人浏览 薄情痞子
摘要

这篇文章给大家分享的是有关React Native与iOS端之间交互的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前置准备首先最好了解一点关于 oc 的语法知识创建声明文件nativeModule.h#

这篇文章给大家分享的是有关React Native与iOS端之间交互的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

前置准备

首先最好了解一点关于 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

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}];;}

感谢各位的阅读!关于“React Native与IOS端之间交互的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: React Native与IOS端之间交互的示例分析

本文链接: https://www.lsjlt.com/news/279099.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • React Native与IOS端之间交互的示例分析
    这篇文章给大家分享的是有关React Native与IOS端之间交互的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前置准备首先最好了解一点关于 oc 的语法知识创建声明文件nativeModule.h#...
    99+
    2023-06-15
  • 详解React Native与IOS端之间的交互
    目录前置准备RN 传值给 iOS方法 1 正常传值给原生方法 2 传递回调函数方法 3 获取 promise 回调方法 4 获取 promise 的同步方式iOS 传值给 RN 端初...
    99+
    2024-04-02
  • 前端ajax与后端交互的示例分析
    这篇文章主要介绍了前端ajax与后端交互的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前端中常常用的与后端交换数据的话,通常是要用...
    99+
    2024-04-02
  • react-native之ART绘图的示例分析
    小编给大家分享一下react-native之ART绘图的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!背景在移动应用的开...
    99+
    2024-04-02
  • vue-Resource与后端数据交互的示例分析
    这篇文章主要为大家展示了“vue-Resource与后端数据交互的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue-Resource与后端数据交互的...
    99+
    2024-04-02
  • Vue前后端数据交互与显示的示例分析
    小编给大家分享一下Vue前后端数据交互与显示的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、技术概述将后端所计算的数据呈现在前端页面的相应位置并根据用...
    99+
    2023-06-15
  • Android App端与PHP Web端的简单数据交互的示例分析
    小编给大家分享一下Android App端与PHP Web端的简单数据交互的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!实现流程流程说明Andorid ...
    99+
    2023-05-30
    android php
  • Android中WebView与H5前端JS代码交互的示例分析
    这篇文章主要为大家展示了“Android中WebView与H5前端JS代码交互的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android中WebView与H5前端JS代码交互的示例分...
    99+
    2023-05-30
    android webview html5
  • React-Native左右联动List的示例分析
    这篇文章将为大家详细讲解有关React-Native左右联动List的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一:左右联动List,在工作中很常见。今天分享...
    99+
    2024-04-02
  • Flex和Html交互的示例分析
    这篇文章给大家分享的是有关Flex和Html交互的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Flex和Html交互◆Flex和Html交互之Flex嵌入到Html:用swfobject,下载的.js地...
    99+
    2023-06-17
  • Javascript之React的示例分析
    这篇文章主要介绍Javascript之React的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言React核心的单向数据流、一切皆数据的state、不会改变的props,...
    99+
    2024-04-02
  • React Native图片查看组件的示例分析
    这篇文章将为大家详细讲解有关React Native图片查看组件的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。React Native 图片查看组件:react...
    99+
    2024-04-02
  • PHP与JavaScript下Cookie交互使用的示例分析
    小编给大家分享一下PHP与JavaScript下Cookie交互使用的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!PHP与JavaScript下Cookie的交互使用下面的例子列出几种情形交互场景,列出JS和ph...
    99+
    2023-06-15
  • Servlet3.0与纯javascript通过Ajax交互的示例分析
    这篇文章主要介绍Servlet3.0与纯javascript通过Ajax交互的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!虽然js.html是一个纯静态的页面,但是以下的程...
    99+
    2024-04-02
  • 响应式React Native Echarts组件的示例分析
    小编给大家分享一下响应式React Native Echarts组件的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言...
    99+
    2024-04-02
  • react native原生模块桥接的示例分析
    这篇文章主要介绍react native原生模块桥接的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Android创建原生模块包通过继承 ReactPackage 为你的原生...
    99+
    2024-04-02
  • React中Native项目框架搭建的示例分析
    这篇文章主要介绍了React中Native项目框架搭建的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。React Native 是Facebook于2015年4月开源...
    99+
    2023-06-15
  • React Native开发封装Toast与加载Loading组件的示例分析
    小编给大家分享一下React Native开发封装Toast与加载Loading组件的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去...
    99+
    2024-04-02
  • React之组件的示例分析
    小编给大家分享一下React之组件的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、分割 render 函数当一个组件...
    99+
    2024-04-02
  • Angular中组件交互的示例分析
    这篇文章将为大家详细讲解有关Angular中组件交互的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Angular 组件交互组件交互: 组件通讯,让两个或多个组件之间共享信息。使用场景: 当某个功...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作