【问题标题】:Push notifications that trigger a background refresh before showing the push notification VS silent push在显示推送通知 VS 静默推送之前触发后台刷新的推送通知
【发布时间】:2015-08-25 23:35:58
【问题描述】:

我想在收到推送时在我的应用中实现后台刷新功能。就在向用户显示推送通知之前,我想从我的后端 (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。后台推送的想法当然是在显示通知之前准备好数据,但它并不像那样工作..

我注意到的另一件事是,静默通知速率受限它们的优先级低于典型的推送通知,所以这肯定也会影响应用程序的效率......

对此的任何指示将不胜感激。只是想弄清楚我是否以正确的方式接近这个问题。一切看起来都很老套...

【问题讨论】:

  • 我已经应用了这个,但是,应用程序 didReceiveRemoteNotification:当应用程序处于后台时,没有从推送通知中打开。你知道为什么吗 ?当我们想要接收推送通知并想要在应用程序处于后台时调用某些程序时使用什么方法? ...我收到通知消息,但在我们按下并打开应用程序之前无法进入程序。做这个过程的任何其他方式?

标签: ios objective-c push-notification


【解决方案1】:

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

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

一个好的方法是向用户发送静默通知,并在完成后触发本地通知(这一点也不难懂)。

这就是 WhatsApp 的运作方式:

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

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

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

【讨论】:

  • 静默通知的优先级是否低于标准 APNS?我知道标准 APNS 是“尽力而为”的事情,但我担心静默通知的优先级甚至比这更低,并且不会通过。
  • 根据苹果的说法,所有通知的传递都是“尽力而为”。我不知道通知类型之间的优先级区别
  • 是的,这也是我读到的。认为这是 xamarin 文档令人困惑的事情。使用静音通知需要应用程序具有后台模式权限,对吗?这是否意味着如果用户禁用它,所有通知都将完全无用?例如alert="" 用于静默通知,因此根本不会显示任何消息,因为我们无法在没有后台模式的情况下引用服务器上的任何内容,因此没有任何内容可放入推送中。
  • 这里有一个很好的教程:g8production.com/post/70884102379/…
  • 为了能够处理静默推送通知,您只需要application:didReceiveRemoteNotification:fetchCompletionHandler: + remote-notification 键到UIBackgroundModes。您是设置优先级的人,但如果您使用 pase.com,它会降低静默通知的优先级。
【解决方案2】:

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

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

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

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

【讨论】:

  • 嘿,谢谢。只是想问几件事。您说没有警报正文的静默通知甚至可能不会发送到设备。没有警报正文的静默通知是什么静默通知没有?从 Apple 文档看来,静默通知和标准通知具有相同的优先级。
  • 晚上写的 =) 当然,我的意思是 content-available 键。在某些情况下,静默通知可能不会发送到设备。例如,如果开启了飞行模式,关闭它后,您将不会收到所有丢失的通知,而只会收到最后一个。它不是一个沉默的。在大多数情况下,将发送带有正文和 content-available 的推送通知。
  • 假设您正在发送 content-available = 1 的推送通知并删除警报,这就是您发送静默通知的方式。但是,这需要用户启用后台模式。如果后台关闭,我们如何向设备发送任何消息?我们无法确定是否为接收用户打开或关闭后台,并决定是发送正常推送还是静默推送。你如何解决这个问题?
  • 正如我上面所说,我们只是发送带有content-availiable 键的警报正文的普通推送通知。即使用户关闭了后台模式,该通知也会发送到设备,应用程序将无法处理它。但用户肯定会看到。在这种情况下,我们无能为力,所以我们正在等待前台并从我们的服务器获取所有错过的消息。
  • 啊,最后一件事,然后我会离开你的头发。因此,如果使用 alert body 和 content-available 执行此操作,这是否意味着如果用户非常快速地打开推送通知,后台获取可能无法完成,并且在加载应用程序消息时会在前台出现延迟?
猜你喜欢
  • 2018-02-17
  • 2017-08-24
  • 2021-05-14
  • 2016-01-23
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
  • 2019-02-07
  • 2015-01-14
相关资源
最近更新 更多