苹果推送通知在后台问题

我正在使用parse.com作为我正在构build的testing应用程序的APNs提供程序。 我已经确认,推送通知正在工作,因为我已经能够成功接收警报,当应用程序在前台。 此外,我有我的plist中指定的UIBackgroundModes键的remote-notification值。

在我的应用程序中,我想要在收到推送通知时将用户的当前位置数据发回给我的应用程序特定的parse.com数据库。 我实际上并不关心通知有效载荷本身,因为通知只是获取一小段信息的一种手段。 该应用程序不断地在后台收集数据,并将其存储在持久的NSDictionary

我已经把位置发送代码放在application:didReceiveRemoteNotification:方法。 如果我的应用程序在前台收到通知时,该方法被调用。 如果我的应用程序在后台,该方法不被调用。

  • 难道我做错了什么?
  • 是否可以在application:didReceiveRemoteNotification:执行一个API请求application:didReceiveRemoteNotification:当应用程序在后台,用户没有与通知交互?

编辑:问题仍然存在,即使当我使用application:didReceiveRemoteNotification:fetchCompletionHandler:

注意:充满位置数据的我的NSDictionary不是空的。 另外,我不试图在后台做任何UI操作 – 只是试图执行一个API请求。

检查以下内容:

  • 通知有效负载包括“可用内容”
 {"alert":"", "badge":"0", "content-available":"1", "sound":""} 

UIApplicationDelegate -application:didReceiveRemoteNotification的文档在这个方法上很清楚:

如果在推送通知到达时应用程序没有运行,该方法将启动应用程序并在启动选项字典中提供适当的信息。 该应用程序不会调用此方法来处理推送通知。 相反,您的应用程序的实现:willFinishLaunchingWithOptions:或应用程序:didFinishLaunchingWithOptions:方法需要获取推送通知有效载荷数据并作出适当的响应。

您需要在两种方法中处理通知,以便在应用程序处于后台和前台时进行响应。

你可以尝试使用这个而不是

 application:didReceiveRemoteNotification 

方法,因为您需要在后台模式下获取您的推送,因此,当应用程序处于后台模式时,这将起作用。 但是,您可能需要在应用程序处于前台时添加自定义通知或UIAlertView来显示您的消息。 希望有所帮助,现在还不算太晚。

 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { NSLog(@"Remote Notification Received: %@", userInfo); UILocalNotification *notification = [[UILocalNotification alloc] init]; notification.alertBody = @"message to be displayed"; notification.applicationIconBadgeNumber = 1; [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; completionHandler(UIBackgroundFetchResultNewData); } 

Alex L的回答几乎为我工作。

只要确保content-available的值是1(数字),而不是string“1”:

 { "alert":"", "content-available":1, "sound":"" } 

badge参数是可选的。

(使用APN的分析服务器)