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

Push notifications that trigger a background refresh before showing the push notification VS silent push

我想在收到推送时在我的应用程序中实现后台刷新功能。就在向用户显示推送通知之前,我想从我的后端 (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...

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

通过快速查看您的 link,这是 xamarin 的指南。那里可能有一些正确的信息,但如果你没有使用 xamarin 我会搜索另一个教程。

一个好的方法是向用户发送静默通知并在完成时触发本地通知(这根本不是 hacky)。

这就是 whatsApp 的运作方式:

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

whatsApp 在 application:didReceiveRemoteNotification:fetchCompletionHandler: 方法中接收它并检查他们的服务器是否有任何用户未收到的“5”之前的通知。如果是这种情况,他们将从他们的服务器中提取该数据,并使用本地通知将其呈现给用户,这基本上只是一种呈现数据的方式,与 APNS 完全无关。

您可以在我写的另一个答案中阅读完整的答案和上下文

我一直在为我的 messaging app 中的相同任务而苦苦挣扎。我们希望用户在用户点击通知之前看到消息。 我们面临的问题:

  • 负载大小限制。 iOS 7 只能有 256 字节的有效负载
  • 如果不是 运行
  • ,单个静默通知将不会启动应用程序
  • content-available 没有警报正文的通知甚至可能无法传送到设备
  • 后台获取不受您的应用程序控制,因此您可能永远不会收到所需的信号,因此我们不能依赖此功能。但这可能有助于实现我们想要的目标
  • iOS 8 有很多 space 的有效负载 - 2KB
  • 如果您发送警报正文 content-available - 在大多数情况下它会被传送并且应用能够处理它

所以我们找到了唯一可以接受的解决方案:我们决定只在 ios8+ 中制作此功能。我们使用 content-available 键发送可见的推送通知,如果进程是 running/frozen,这允许我们处理通知负载,如果应用程序不是 运行,两者都能够呈现通知。如果应用程序收到推送通知,它会获取警报文本正文并将其写入本地数据库,以便用户能够在对话中阅读它。根据我们的统计,消息的平均大小不超过 200 个符号,因此大多数时候不需要额外请求。如果消息超过 200 个符号,我们使用额外的参数扩展有效负载主体,该参数用于在推送通知处理中请求文本主体。用户将看到裁剪后的文本,但在完成请求后,我们会使用接收到的值在本地数据库中重写一条消息。

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