我有一个React Native应用程序,我试图获得一个发送到
JavaScript处理程序的静默iOS推送通知.
我看到的行为是AppDelegate中的didReceiveRemoteNotification函数被调用,但是我的JavaScript中的处理程序不会被调用,除非应用程序在前台,或者最近才被关闭.
我很困惑的事情显然是应用程序正在被唤醒,并且它的didReceiveRemoteNotification函数被调用,但是然后调用[RCTPushNotificationManager didReceiveRemoteNotification:notification]似乎没有任何作用.
另外,如果我在收到通知后打开应用程序,那么我看到React Native处理程序在这一点被调用.
我的didReceiveRemoteNotification功能如下所示:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)notification { NSLog(@"didReceiveRemoteNotification"); [RCTPushNotificationManager didReceiveRemoteNotification:notification]; }
在我的React Native应用程序的Root组件中,我有:
componentDidMount() { AppState.addEventListener('change',this.handleAppStateChange); PushNotificationIOS.addEventListener('notification',(notification) => { console.log("notification recieved"); }) } handleAppStateChange(currentAppState) { console.log(currentAppState); }
我使用AWS SNS发送推送通知,并显示以下消息:
{ "APNS_SANDBOX":"{\"aps\":{\"content-available\":\"1\"}}" }
这是XCode的日志:
2016-04-20 10:38:01.255 [info][tid:com.facebook.React.JavaScript] inactive 2016-04-20 10:38:01.986 [info][tid:com.facebook.React.JavaScript] background 2016-04-20 10:38:17.279 test[4056:1383261] didReceiveRemoteNotification 2016-04-20 10:38:17.284 [info][tid:com.facebook.React.JavaScript] notification recieved 2016-04-20 10:44:56.330 test[4056:1383261] didReceiveRemoteNotification 2016-04-20 10:44:56.332 [info][tid:com.facebook.React.JavaScript] notification recieved 2016-04-20 10:46:07.091 test[4056:1383261] didReceiveRemoteNotification 2016-04-20 10:49:30.039 [info][tid:com.facebook.React.JavaScript] notification recieved 2016-04-20 10:49:30.639 [info][tid:com.facebook.React.JavaScript] active
在此日志中,发送3个推送通知.在10:38和10:44收到的两个都正确地称为JavaScript.
但是,在10:46收到的那个没有在JavaScript中调用处理程序,直到我在10:49打开应用程序.
有什么我可以做的,以确保即使应用程序不运行,我的React Native代码的调用?
解决方法
为了在后台点击你的应用程序的通知,您还需要定义一个fetchCompletionHandler,其中包含完成处理函数,如下所示. aps:{content-available:1}有效载荷应该唤醒你的应用程序,并在你的AppDelegate中触发这个代码,然后在RN中命中你的JavaScript.
// fetch notifications in the background and foreground -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)notification fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { [RCTPushNotificationManager didReceiveRemoteNotification:notification]; completionHandler(UIBackgroundFetchResultNewData); NSLog(@"Notification Body %@",notification); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。