NativeEventEmitter 实现 iOS 原生事件通知

上一篇我们知道了 RN 如何结合 iOS 进行混合开发,接下来我们再增加 iOS 原生事件通知的功能,其中结合了 navigation API,不需要可以直接去掉。

1、RN

import React, {useEffect} from 'react';
import {View, Text, Button, StyleSheet} from 'react-native';
import {NativeModules, NativeEventEmitter} from 'react-native';
// 使用 NativeModules 来获取到自定义的 iOS 原生模块
// 使用 NativeEventEmitter 实现 iOS 原生事件通知

const MyModule = NativeModules.MyModule; 
// 这是我自定义的模块
let listener = null;
// 为了方便在这里直接定义,以便于后续清除副作用

const InfoScreen = ({navigation}) => {
  // 在组件挂载阶段和卸载阶段执行,监听原生事件
  useEffect(() => {
    const eventEmitter = new NativeEventEmitter(MyModule);
    listener = eventEmitter.addListener('EventReminder', result => {
      alert('获取到iOS原生事件通知' + result);
      console.log(result);
    });

    return () => {
      listener && listener.remove();
    };
  }, []);
  return (
    <View style={styles.main}>
      <Text>Info Screen</Text>
      <Button
        title="计算"
        onPress={() => {
          MyModule.squareMe('9', (err, num) => console.log(num));
          console.log(MyModule.hello);
        }}
      />
      <Button title="Go to One" onPress={() => navigation.navigate('Three')} />
    </View>
  );
};

const styles = StyleSheet.create({
  main: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
  },
});

export default InfoScreen;

2、MyModule.h

#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
#import <React/RCTLog.h>
#import <React/RCTConvert.h>
#import <EventKit/EventKit.h>
#import <UIKit/UIKit.h>
// 继承RCTEventEmitter
#import <React/RCTEventEmitter.h>

// NSObject 改成 RCTEventEmitter
@interface MyModule : RCTEventEmitter <RCTBridgeModule>

@end

3、MyModule.m

#import "MyModule.h"

@implementation MyModule

RCT_EXPORT_MODULE()

- (NSDictionary *)constantsToExport {
  return @{
    @"hello": @"这是我编写的第一个 iOS 原生模块!",
    @"me": @"我是谁?"
  };
}
RCT_EXPORT_METHOD(addEventMoreTwo:(NSString *)name location:(NSString *)location date:(NSString *)ISO8601DateString)
{
  NSDate *date = [RCTConvert NSDate:ISO8601DateString];
  NSLog(@"Pretending to create an event %@ at %@ at %@", name, location, date);
  RCTLogInfo(@"Pretending to create an event %@ at %@ at %@", name, location, date);
}

RCT_EXPORT_METHOD(squareMe:(NSString *)number:(RCTResponseSenderBlock)callback) {
  // 发送事件的方法
  [self sendEventWithName:@"EventReminder" body:@{@"name": number}];
  
  int num = [number intValue];
  callback(@[[NSNull null], [NSNumber numberWithInt:(num*num)]]);
}

// 注册事件名称
- (NSArray<NSString *> *)supportedEvents
{
  return @[@"EventReminder"];
}


@end
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易山易酒易诗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值