React Native 移动推送
RN广播消息的需求一般基本为:后台发送消息,手机通知栏显示消息,点击通知栏内的消息,App会根据后台发送的消息进行相对应具体页面的跳转。
RN端的重点:需要从原生端接收到具体的参数信息,再根据具体的参数,利用React-navigation等跳转组件进行跳转。
Android端
SDK集成可直接参照官网
http://docs.developer.qq.com/xg/android_access/jcenter.html
集成完毕之后,就可以按照腾讯信鸽服务平台进行推送。
当点击通知栏的信息,信鸽SDK有具体的方法可以获取到相对应的消息的详细信息,包括我们所需的参数信息。
每当点击通知栏消息的时候,都会执行Activity生命周期函数,在重写的生命周期函数里,可以通过信鸽的SDK获取消息的详细信息。
点击通知消息,一般有以下三种情况:
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中存储静态变量。