笔者作为一名iOS程序猿,自从进入RN这个坑以后、就一直在奋力爬坑,这次也是本猿第一次发简书文章,虽说在此之前遇到过很多RN大坑、之后也是走了出来,但一直都没来得及记录和大家分享,今天爬坑之后刚好有点时间、所以就写出来和大家分享一下,说的不妥的地方还望批评指点。
首先此篇文章是在默认大家已经有iOS经验以及对RN有一定了解的基础上进行的。(后期会为大家分享RN入门的一些必踩坑)
要使用推送通知功能,首先在苹果后台配置推送通知服务并且准备好服务端的系统。接下来就是关于RN方面的事情了,在这里如果已经使用RN开发了很多功能的童鞋可能会找一些第三方封装好的React Native Push Notifications之类的(笔者就是这么兴冲冲的跑去找了),其实是不必要的,因为Facebook官网已经给出了PushNotificationIOS很好的解决方案。
首先在Libraries路径下找到RCTPushNotification.xcodeproj工程文件拖拽到项目中
这里注意在node_modules下的react-native中逐级查找并拖拽到xCode工程中
首先请手动链接PushNotificationIOS的库(以下操作如果不熟悉,请自行补习Xcode的使用教程):
将node_modules/react-native/Libraries/PushNotificationIOS/RCTPushNotification.xcodeproj文件拖到Xcode界面中
在Xcode的Link Binary With Libraries中添加libRCTPushNotification.a
在Header Search Paths中添加:$(SRCROOT)/../node_modules/react-native/Libraries/PushNotificationIOS
将搜索选项设为recursive
至此,关于PushNotificationIOS的文件以及环境我们已经添加完了,接下来就是在xCode中配置极光推送。一切准备就绪之后,接下来就是我们在代码中实现我们的推送功能了。
那么...问题就来了,这也是笔者所踩的坑。如果有尝试过这样实现推送的童鞋就会发现,RN接入的代码按照官方提供的写,并且极光推送注册等也是按照极光官方实现的,此时在极光后台推送一条消息,客户端在后台的情况下会收到消息提醒,但是点击提醒进入前台、RN代码是接收不到消息内容的。。。接收不到!!!(本猿就是在这个坑里蹲了两天😢)。
// Required to register for notifications
- (void)application:(UIApplication *)applicationdidRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { [RCTPushNotificationManagerdidRegisterUserNotificationSettings:notificationSettings]; }
// Required for the register event.
- (void)application:(UIApplication *)applicationdidRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { [RCTPushNotificationManagerdidRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; }
// Required for the notification event.
- (void)application:(UIApplication *)applicationdidReceiveRemoteNotification:(NSDictionary *)notification { [RCTPushNotificationManagerdidReceiveRemoteNotification:notification]; }
// Required for the localNotification event.
- (void)application:(UIApplication *)applicationdidReceiveLocalNotification:(UILocalNotification *)notification { [RCTPushNotificationManagerdidReceiveLocalNotification:notification];}
笔者在找到问题之前检查了所有的代码,和官方的没有出入,通过断点跟踪发现以上几个回调方法在收到推送的时候根本没有执行,这也就是说当系统收到推送消息的时候根本没办法发送给RN调用。万般无奈之下,笔者又去看了一遍极光推送的官方接入指南,发现多了两个方法(iOS10 support)
#pragma mark- JPUSHRegisterDelegate
// iOS 10 Support
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
// Required
NSDictionary * userInfo = notification.request.content.userInfo;
if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
[JPUSHService handleRemoteNotification:userInfo];
}
completionHandler(UNNotificationPresentationOptionAlert); // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以选择设置
}
// iOS 10 Support
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
// Required
NSDictionary * userInfo = response.notification.request.content.userInfo;
if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
[JPUSHService handleRemoteNotification:userInfo];
}
completionHandler(); // 系统要求执行这个方法
}
再次断点跟踪并且打印userinfo参数,发现此方法执行并且收到了推送消息内容,于是笔者在这两个方法中执行了[RCTPushNotificationManager didReceiveRemoteNotification:userInfo];犯法,将接收到的消息发送到RN回调方法中,至此在RN中写的监听事件便可以收到推送消息,代码如下:
staticaddEventListener(type: string, handler: Function)
当然RN这里还有很多处理推送消息的方法,比如badge设置等,具体细节此处不再赘述,大家可以参照RN官网。
最后的最后,本猿终于爬出坑了!😭😭😭