我想在我的应用程序中实现后台刷新功能,以便在接收到推送通知时执行。在将推送通知显示给用户之前,我想从后端(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);
}];
}
}
后台刷新被调用并显示推送通知,但是该推送通知并不等待后台任务完成就立即被显示。这是正常的功能吗?上面的教程表明,直到后台任务完成之前,通知才会被显示。
然后我尝试了一种“静默通知”,当接收到推送时,它会触发应用在后台下载消息,但不显示通知。因此,在下载完成后,我通过触发本地通知来实现这一点。这真的是正确的做法吗?传统的应用程序(如WhatsApp)是否使用静默通知触发后台刷新,然后触发本地通知?似乎有点hacky。毕竟,后台推送的想法是在显示通知之前准备好数据,但事实并非如此。
我注意到另一件事是,静默通知受到限制,它们的优先级低于典型推送通知,因此这显然也会影响应用程序的效率...
如果您对此有任何指导,真的会很感激。只是试图理解我是否以正确的方式处理此问题。所有这些都似乎非常hacky...