在显示推送通知和静默推送之前,推送触发后台刷新的通知

我想在我的应用程序中实现后台刷新function,当收到一个推送。 就在向用户显示推送通知之前,我想从后端(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); }]; } } 

调用后台刷新并显示推送,但推送通知不会等待后台任务完成。 只要收到,就显示出来。 这是正确的function? 上面的教程build议通知将不显示,直到后台任务完成。

然后,我尝试了一个无声的通知 ,这触发了应用程序在收到推送时没有通知显示的情况下在后台下载消息。 所以我通过在下载完成之后发出本地通知来做到这一点。 这真的是正确的做法吗? 做传统的应用程序,如whatsapp触发一个无声的通知后台刷新,然后发射本地? 似乎有点哈克。 当然,后台推送的想法是在显示通知之前准备好数据,但是不能像那样工作。

我注意到的另一件事是,无声的通知率是有限的,他们有一个比典型的推送通知更低的优先级,所以肯定这会阻碍应用程序的效率… …

任何指针,这将是非常感激。 只是试图让我的头,如果我正在接近这个正确的方法。 所有似乎很hacky …

我一直在与我的消息应用程序中的相同任务挣扎。 我们希望用户在用户点击通知之前查看消息。 我们面临的是:

  • 有效载荷大小的限制。 iOS 7只能有256个字节的有效载荷
  • 如果没有运行,单个无声通知将不会启动应用程序
  • 无警报主体的content-available通知可能甚至不会被传送到设备
  • 背景抓取不受您的应用程序控制,因此您可能永远不会收到所需的信号,所以我们不能依靠此function。 但是,这可能有助于实现我们想要的额外方式
  • iOS 8有很多的有效载荷空间 – 2KB
  • 如果您发送警报主体 content-available – 它将在大多数情况下交付,并且应用程序能够处理它

所以我们来到了唯一可以接受的解决scheme:我们决定只在ios8 +中使用这个特性。 我们发送带有content-available密钥的可见推送通知,允许我们在进程正在运行/冻结时处理通知有效负载,并且在应用程序未运行时都能够显示通知。 如果一个应用程序接收到推送通知,它将提取文本正文并将其写入本地数据库,以便用户能够在对话中读取它。 根据我们的统计,消息的平均大小不超过200个符号,所以大多数时候不需要额外的请求。 如果消息长度超过200个符号,则在推送通知处理中用额外的参数来扩展有效载荷体。 用户将看到一个裁剪版本的文本,但是在请求完成后,我们用接收到的值在本地数据库中重写消息。

因此,该技术使我们能够在大多数情况下立即向用户显示收到的消息。如果应用程序未运行,我们向服务器发出请求,以便在应用程序启动后立即获取丢失的消息。 这是我们可以在iOS上获得的最快和最可接受的情况。 希望我的经验能帮助你实现你想要的。

你混合了一些东西在一起。

从快速查看您的链接,这是xamarin指南。 可能有一些正确的信息,但如果你不使用xamarin我会寻找另一个教程。

一个好的方法是发送一个无声的通知给用户,并在完成时触发本地通知(这根本不算什么)。

这就是whatsApp如何使其工作:

当whatsApp在后台时,会收到单个推送通知(例如“5”),该消息不会显示给用户。

application:didReceiveRemoteNotification:fetchCompletionHandler:在方法application:didReceiveRemoteNotification:fetchCompletionHandler:接收它application:didReceiveRemoteNotification:fetchCompletionHandler:并检查是否存在用户未收到“5”之前的任何通知。 如果是这样的话,他们会从服务器上获取这些数据,并使用本地通知向用户展示这些数据,这些通知基本上只是一种呈现数据而与APNS无关的方式。

你可以在这里写的另一个答案阅读完整的答案和上下文