参考链接:https://www.jianshu.com/p/668024972b44
这块之前按照文档写,写的不完整,报错 bridge is not set.
首先继承RCTEventEmitter
,实现suppportEvents
方法并调用self sendEventWithName:
。
#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
#import <React/RCTEventEmitter.h>
@interface NoticaManager : RCTEventEmitter<RCTBridgeModule>
@end
#import "NoticaManager.h"
@implementation NoticaManager
RCT_EXPORT_MODULE();
-(id)init
{
self = [super init];
if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivePushNotificateRN:) name:@"EventReminder" object:nil];
}
return self;
}
- (NSArray<NSString *> *)supportedEvents
{
return @[@"EventReminder"];
}
- (void)receivePushNotificateRN:(NSNotification *)notification
{
NSString *eventName = notification.userInfo[@"name"];
[self sendEventWithName:@"EventReminder" body:@{@"name": eventName}];
}
@end
JavaScript代码可以创建一个包含你的模块的NativeEventEmitter
实例来订阅这些事件。导入NativeModules,NativeEventEmitter
import {
Platform,
StyleSheet,
Text,
View,
AppRegistry,
NativeModules,
NativeEventEmitter
} from 'react-native';
const { NoticaManager } = NativeModules;
const calendarManagerEmitter = new NativeEventEmitter(NoticaManager);
componentDidMount(){
const subscription = calendarManagerEmitter.addListener(
'EventReminder',
(reminder) => console.log(reminder.name)
);
}
原生调用交互入口:
#import "SecondViewController.h"
#import "NoticaManager.h"
@interface SecondViewController ()
@end
@implementation SecondViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor redColor];
UIButton*btn = [UIButton new];
btn.frame = CGRectMake(100, 60, 100, 40);
[btn setTitle:@"调用RN" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(clickBtn) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
NoticaManager*managet = [[NoticaManager alloc]init];
// Do any additional setup after loading the view.
}
-(void)clickBtn{
[[NSNotificationCenter defaultCenter] postNotificationName:@"EventReminder" object:nil userInfo:@{@"name":@"li"}];
}