React Native 移动推送 信鸽集成

2 篇文章 0 订阅
2 篇文章 0 订阅

React Native 移动推送

RN广播消息的需求一般基本为:后台发送消息,手机通知栏显示消息,点击通知栏内的消息,App会根据后台发送的消息进行相对应具体页面的跳转。
RN端的重点:需要从原生端接收到具体的参数信息,再根据具体的参数,利用React-navigation等跳转组件进行跳转。

Android端

SDK集成可直接参照官网
http://docs.developer.qq.com/xg/android_access/jcenter.html
集成完毕之后,就可以按照腾讯信鸽服务平台进行推送。

当点击通知栏的信息,信鸽SDK有具体的方法可以获取到相对应的消息的详细信息,包括我们所需的参数信息。
每当点击通知栏消息的时候,都会执行Activity生命周期函数,在重写的生命周期函数里,可以通过信鸽的SDK获取消息的详细信息。
Activity生命周期函数

点击通知消息,一般有以下三种情况:
App在前台显示的情况下,点击通知栏中的通知信息。这种情况下,生命周期为 onPause -> onResume
App没关闭,在后台运行的情况下,点击通知栏中的通知信息,此刻会唤醒App。这种情况下,生命周期为 onPause->onStop->onRestart->onStart->onResume
App关闭,并且在后台已经清除App的情况下,点击通知栏的通知信息,此刻会重新打开App。这种情况下,生命周期为 onStart->onResume。

前两种情况:
需要利用原生主动向RN端发送信息

this.getReactInstanceManager()
.getCurrentReactContext()
.getJSModule(DeviceEventManagerModule
.RCTDeviceEventEmitter.class)
.emit("TencentXG",click.getCustomContent());

RN端增添相应的监听就可以
DeviceEventEmitter.addListener(“TencentXG”,(params)=>{});

对于第三种情况,使用第一种方法是不可行的。因为是重新打开,所以原生的emit事件是比RN监听事件要早的,所以RN端是监听不到原生发送的事件事件的。
因为MainActicity是一直存在的,所以我选择讲click.getCustomContent()存放在MainActivity的静态变量中。而关闭重新打开App的时候,RN都需要像原生端发送请求,获取MainActivity的静态变量,若此变量是clickResult,则进行相对应的跳转。

IOS的情况

SDK集成以及证书设置参考
http://docs.developer.qq.com/xg/ios_access/certificate_config.html
http://docs.developer.qq.com/xg/ios_access/api_3.0.html

IOS端的具体思路与Android的类似:
也分为这三种情况:
App在前台的情况下;App没关闭,在后台运行的情况;App关闭,并且在后台已经清除App的情况。

*只讨论ios10的情况,ios10以下的与ios9类似


- (void)xgPushUserNotificationCenter:(UNUserNotificationCenter *)center
    didReceiveNotificationResponse:(UNNotificationResponse *)response
    withCompletionHandler:(void(^)())completionHandler {
      [[XGPush defaultManager] reportXGNotificationInfo:response.notification.request.content.userInfo];
    completionHandler()
}

但是第一种情况会多走一个回调函数:


- (void)xgPushUserNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
[[XGPush defaultManager] reportXGNotificationInfo:notification.request.content.userInfo];
    completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert);
}

在此可以设置Badge、Sound、Alert,这里不用此函数像RN端传递信息。

所以我们只讨论第一个回调函数,与Android不同,IOS不能通过Appdelegate类,直接向RN端发送信息(不包括initialProperties的方式,而且此方式对此不适用)。
所以需要通过RCTEventEmitter来进行原生对RN端的推送。
所以这个信息传递的流程为:Appdelegate -> RCTEventEmitter -> RN端。

Appdelegate -> RCTEventEmitter需要用到NSNotificationCenter类,
在xgPushUserNotificationCenter回调中,我们执行postNotificationName方法

  NSDictionary *dict = response.notification.request.content.userInfo;
 [[NSNotificationCenter defaultCenter] postNotificationName:@"notifyTencentXG" object:@{@"optionKey":dict}];

而在RCTEventEmitter类中,我们在初始化中添加好监听方法就可以了

- (instancetype)init
{
self = [super init];
  if (self) {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notifyTencentXG:) name:@"notifyTencentXG" object:nil];

  }
  return self;
}
- (void)notifyTencentXG:(NSNotification *)notifyTencentXG
{
  NSDictionary *tencentXGDic = [notifyTencentXG object];
  NSString *optionValue = [tencentXGDic objectForKey:@"optionKey"];
  [self sendEventWithName:@"getXGInformation" body:@{@"optionKey":optionValue}];
}

RCTEventEmitter -> RN端:
参考https://reactnative.cn/docs/0.51/native-modules-ios.html

App关闭,并且在后台已经清除App的情况。这种情况,与Android一样,不能直接推送,所以可以选择与
Android一样的方法,在AppDelegate中存储静态变量。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值