我通过content-available在推送通知上使用标志来触发后台获取.我有fetch和remote-notification UIBackgroundModes启用.
这是我在AppDelegate.m中使用的实现:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
NSLog(@"Remote Notification Recieved");
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.alertBody = @"Looks like i got a notification - fetch thingy";
[application presentLocalNotificationNow:notification];
completionHandler(UIBackgroundFetchResultNewData);
}
Run Code Online (Sandbox Code Playgroud)
当应用程序在后台运行时,它可以正常工作.(收到通知,应用程序触发"看起来像我收到通知"本地通知,因为上面的代码应该这样做).
但是,当应用程序未运行并且收到带有content-available标志的推送通知时,应用程序不会启动,并且didRecieveRemoteNotification永远不会调用委托方法.
WWDC视频最新的多任务处理(来自WWDC 2013的#204)显示了这一点:
它表示当收到带有content-available标志的推送通知时,应用程序将"启动到后台" .
为什么我的应用程序没有启动到后台?
所以真正的问题是:
用户强行退出应用后,iOS会执行后台任务吗?
我正在使用parse.com作为我正在构建的测试应用程序的APN提供程序.我已经确认推送通知正在运行,因为我已经能够在应用程序位于前台时成功接收警报.此外,我有我的plist中指定remote-notification的UIBackgroundModes键的值.
在我的应用程序中,我希望在收到推送通知时将用户的当前位置数据发送回我的应用程序特定的parse.com数据库.我实际上并不关心通知有效负载本身,因为通知只是获取一小段信息的一种方法.该应用程序不断在后台收集数据并将其存储在持久性数据中NSDictionary.
我把位置发送代码放在application:didReceiveRemoteNotification:方法中.如果我的应用程序在收到通知时位于前台,则会调用该方法.如果我的应用程序在后台,则不会调用该方法.
application:didReceiveRemoteNotification:在应用程序在后台并且用户没有与通知进行交互时执行API请求吗?**编辑:即使我使用,问题仍然存在application:didReceiveRemoteNotification:fetchCompletionHandler:.
注意:我的NSDictionary充满了位置数据不是空的.此外,我不是试图在后台进行任何UI操作 - 只是尝试执行API请求.