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

Kex*_*Kex 24 objective-c push-notification ios

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

Seg*_*ero 17

我一直在为我的消息应用程序中的相同任务而苦苦挣扎.我们希望用户在用户点击通知之前就能看到该消息.我们面临的问题:

  • 有效负载大小限制.iOS 7的有效负载只能有256个字节
  • 单个静默通知如果未运行,将无法启动应用程序
  • content-available 没有警报体的通知甚至可能无法传送到设备
  • 后台提取不受您的应用程序控制,因此您可能永远不会收到所需的信号,因此我们无法依赖此功能.但这可能有助于实现我们想要的另一种方式
  • iOS 8有很多有效载荷空间 - 2KB
  • 如果您发送警报的身体 content-available -它会在大多数情况下,交付和应用程序能够处理它

所以我们找到了唯一可接受的解决方案:我们决定仅在ios8 +中使用此功能.我们使用content-available密钥发送可见推送通知,这允许我们在流程正在运行/冻结时处理通知有效负载,并且如果应用程序未运行则都能够提供通知.如果应用程序收到推送通知,它会将警报文本正文写入本地数据库,因此用户可以在对话中读取它.根据我们的统计数据,消息的平均大小不超过200个符号,因此大多数情况下不需要额外的请求.如果消息长于200个符号,我们使用额外参数扩展有效负载体,该参数用于在推送通知处理中请求文本体.用户将看到文本的裁剪版本,但在请求完成后,我们使用接收的值重写本地数据库中的消息.

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


Seg*_*gev 9

你把一些东西混合在一起.

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

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

这就是whatsApp使它工作的方式:

当whatsApp处于后台时,会收到单个推送通知(例如"5").该消息将不会显示给用户.

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

您可以阅读另一个答案我写了完整的答案和背景在这里