博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 原生模块 给 Javascript(ReactNative) 发送事件 (通知监听)
阅读量:5939 次
发布时间:2019-06-19

本文共 2687 字,大约阅读时间需要 8 分钟。

官方中文文档是这样描述的:
 

 

就给我们这几句话 就打发我们了。

按照上面的写法,根本不知道 
- (void)calendarEventReminderReceived:(NSNotification *)notification 方法  什么时候去调用。
 
但是我们根据iOS知识,知道想要发送通知,肯定要先监听通知。
 
所以我们要
保证RN组件 先监听事件通知,在去原生组件发送事件通知
 
原生组件:
EventEmitterManager.h
#import 
#import
@interface EventEmitterManager : RCTEventEmitter
@end

EventEmitterManager.m

#import "EventEmitterManager.h"#import 
#import
NSString *const kEventEmitterManagerEvent = @"EventEmitterManagerEvent";@implementation EventEmitterManager//@synthesize bridge = _bridge;RCT_EXPORT_MODULE();// 等 RN组件 监听事件通知后 在发送事件通知RCT_EXPORT_METHOD(postNotificationEvent:(NSString *)name){ RCTLogInfo(@"postNotificationEvent->:%@",name); [self sendEventWithName:kEventEmitterManagerEvent body:name];}- (NSDictionary
*)constantsToExport { return @{ @"EventEmitterManagerEvent": kEventEmitterManagerEvent, };}- (NSArray
*)supportedEvents { return @[kEventEmitterManagerEvent,];}@end
RN组件:
componentWillMount(){        // 拿到原生模块        var EventEmitterManager = NativeModules.EventEmitterManager;        // 创建自定义事件接口        const eventEmitterManagerEmitter = new NativeEventEmitter(EventEmitterManager);        // 导出常量        const EventEmitterManagerEvent   = EventEmitterManager.EventEmitterManagerEvent;        // 监听原生 发送的通知        this.listener = eventEmitterManagerEmitter.addListener(            EventEmitterManagerEvent,            (data) => Alert.alert('来了 来了 ->'+ data)        );    }    componentDidMount() {        var EventEmitterManager = NativeModules.EventEmitterManager;        // 调用原生模块 postNotificationEvent方法        EventEmitterManager.postNotificationEvent('张杨事件传递');    }    componentWillUnmount(){        this.listener.remove();    }
 
可以看到 
componentWillMount 中 先监听通知 
componentDidMount 中 再调用原生模块方法去发送通知  
componentWillUnmount 中 再去移除监听
 
还有一个小Tip:
我在写demo时候 不想一直 在 index.ios.js 中 去添加其他组件,然后RCTRootView去实例化。
所以我就投机一下,
 
- (IBAction)postNotification:(id)sender {    _jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"src/PostNotification" fallbackResource:nil];  _rootView = [[RCTRootView alloc] initWithBundleURL : _jsCodeLocation                                  moduleName        : @"PostNotification"                                  initialProperties : nil                                  launchOptions     : nil];  UIViewController *vc = [[UIViewController alloc] init];  vc.view = _rootView;   [self.navigationController pushViewController:vc animated:YES];}
bundleRoot 写路径  
src/PostNotification    
 
 
 

转载于:https://www.cnblogs.com/zhangyang17/p/6929303.html

你可能感兴趣的文章
基础复习-算法设计基础 | 复杂度计算
查看>>
debian、ubuntu系统下,常用的下载工具
查看>>
带以太网的MicroPython开发板:TPYBoardv201温湿度上传实例
查看>>
如何解压缩后缀名为zip.001,zip.002等的文件
查看>>
OSGI企业应用开发(十二)OSGI Web应用开发(一)
查看>>
Python 以指定概率获取元素
查看>>
微信公众平台图文教程(二) 群发功能和素材管理
查看>>
关于System.Collections空间
查看>>
Centos下基于Hadoop安装Spark(分布式)
查看>>
Centos 7.5 部署DNS
查看>>
yum简介
查看>>
cp讲解
查看>>
MariaDB Galera Cluster 部署(如何快速部署MariaDB集群)
查看>>
如何在 Swift 语言下使用 iOS Charts API 制作漂亮图表?
查看>>
论代码审查的重要性
查看>>
「docker实战篇」python的docker爬虫技术-导学(一)
查看>>
如何确定一个网站是用Wordpress开发的
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
wdcp 安装
查看>>