我通过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会执行后台任务吗?
在我的设置标签栏中:
我认为更好的解决方案是发送静默推送通知,我可以使用它来进行API调用,以便在需要时更新设置UI.
但如果用户已禁用推送通知,我仍会收到静音推送吗?处理此类情况的推荐方法是什么?
notifications objective-c push-notification ios silent-notification
我想在我的应用程序中实现后台刷新功能,以便在收到推送时.就在向用户显示推送通知之前,我想从后端(Parse.com)下载新消息并将它们保存到阵列中.我正在按照这里的指南:http://developer.xamarin.com/guides/ios/application_fundamentals/backgrounding/part_3_ios_backgrounding_techniques/updating_an_application_in_the_background/
我不确定这个指南有多准确.它指出:iOS 7(及更高版本)通过在通知用户之前为应用程序提供在后台更新内容的机会来扩展普通推送通知,以便用户可以打开应用程序并立即呈现新内容.
所以我试着像这样实现我的后台推送:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler
{
if([[userInfo objectForKey:@"aps"] objectForKey:@"content-available"]){
NSLog(@"Doing the background refresh");
UINavigationController *navigationController=(UINavigationController *)[[[UIApplication sharedApplication] keyWindow] rootViewController];
MyViewController *myViewController = (MyViewController *)[[navigationController viewControllers] objectAtIndex:1];
[myViewController.currentUser refreshMessagesArrayWithCompletionHandler:^(BOOL successful, BOOL newMiaos) {
NSLog(@"messages refreshed the array now has %lu messages",(unsigned long)[myViewController.currentUser.messages count]);
handler(UIBackgroundFetchResultNewData);
}];
}
}
Run Code Online (Sandbox Code Playgroud)
调用后台刷新并显示推送,但推送通知不等待后台任务完成.它只是在收到后立即显示.这是正确的功能吗?上面的教程建议在后台任务完成之前不会显示通知.
然后我开始尝试静默通知,这会触发应用程序在收到推送时在后台下载消息,但不会显示任何通知.因此,我通过在下载完成后触发本地通知来执行此操作.这真的是正确的做法吗?传统应用程序(如whatsapp)是否使用静默通知触发后台刷新,然后触发本地应用程序?看起来有点hacky.当然,后台推送的想法是在显示通知之前准备好数据,但它并不像那样工作.
我注意到的另一件事是静默通知是速率限制的,它们的优先级低于典型的推送通知,所以这肯定会妨碍应用程序的效率......
对此的任何指示都将非常感激.如果我正在以正确的方式接近这个问题,那就试着试试.一切似乎都非常hacky ......