我应该在收到有效负载后更新我的应用吗 或者我应该通过允许它自己下载来更新它?

Hon*_*ney 5 apple-push-notifications ios swift remote-notifications silent-notification

当您的iPhone收到WhatsApp/Telegram推送通知时,例如

wife:
"buy pizza"
Run Code Online (Sandbox Code Playgroud)

问题1:应用程序是否必须自行下载/接收.这是手机上弹出的横幅必须为自己下载+我的Whatsapp/Telegram必须再次自行下载?

我的朋友回答说:

推送通知可以将消息作为有效负载.您的应用可以提取并动态插入到对话中而无需另外请求 - 我之前已经这样做了.让它感觉更加快捷.缺点是您不能保证推送将以正确的顺序(或根本没有)到达.

但我不相信,从语义的角度来看,推送通知不应该真正更新你的应用程序.如果他们这样做将是一种滥用......他们应该只通知您的应用程序更新,然后允许您通过下载任何已提供的新内容来自行更新.

因此,要查看顶级公司及其应用是否正在应用我的朋友建议我使用3个应用(Gmail,WhatsApp,Telegram)进行了一些实验:

我关闭了Wifi,但保留了蜂窝数据,然后我也禁用了应用程序使用Cellular数据的访问权限.

在此输入图像描述

然后我有人给我发了一条消息/电子邮件:这是我的结果:

电报::我收到警报(发件人+第一行).但是一旦我打开应用程序(或点击通知),它就没有我的新消息或任何东西.

但是,如果允许Telegram访问互联网...它会在后台下载消息...即如果我遵循以下顺序:我是wifi或没有互联网限制的蜂窝数据 - >收到通知 - >转互联网完全关闭,但然后转到应用程序:我会在那里看到完整的消息/正文.

Gmail:我收到提醒(有预览主题/发件人/正文)但是一旦我打开应用程序,它就没有我的新消息或任何东西.

如果Gmail应用程序被允许访问互联网......那么与Telegram相反:只有在打开应用程序本身之前,它才会下载/更新Gmail中的电子邮件.我猜Gmail没有content-available设置,1但Telegram设置为1

WhatsApp:我什么都没得到.

没有互动发生在接到通知......这只有当应用程序被下载情况本身.

我的结论是:

没有互动发生在接到通知......这只有当应用程序被下载情况本身独立于有效载荷的到来.

Gmail和Telegram正在进行冗余下载,基本上不够智能,我的朋友建议或者没有收到电子邮件/消息的风险太大,最好安全一点:thinking_face:

问题2:这个结论是否正确?

Cod*_*256 4

首先,下载有效负载通常不是问题。我认为有效负载通常非常小(对于短文本消息可能<1Kb)。事实上,常规远程负载的最大大小为 4KB(VoIP 通知为 5KB)。请参阅创建远程通知负载

其次,您的应用程序很难访问任何远程通知数据。唯一可能的方法是通过静默通知,不建议将其用于简单的文本通知。无声通知会唤醒您的应用程序,并在再次关闭之前给它 30 秒的时间在后台执行操作。您可能会发送远程静默通知,使您的应用程序根据该远程通知手动触发常规本地通知(或同时发送静默通知和常规远程通知),但同样,不建议使用这种静默通知:

静默通知并不是让您的应用程序在后台保持唤醒状态的一种方式,也不是用于高优先级更新的。APN 将静默通知视为低优先级,如果总数过多,可能会完全限制其传送。实际限制是动态的,可以根据条件而变化,但尽量不要每小时发送超过几个通知。

有关详细信息,请参阅配置静默通知。

应用程序在收到远程通知时“下载”远程通知的另一种可能方式在修改远程通知的有效负载中进行了描述。您可以简单地保存通知并选择不修改它们。

对于您的任何一个问题,没有适用于所有应用程序的通用是/否答案。相反,应用程序可以通过多种不同的方式接收远程通知并处理其数据。

编辑:您还应该application(_:didReceiveRemoteNotification:fetchCompletionHandler:)从通知的用户信息中实现和检索/保存数据,以便数据在您的应用程序中更快地可用。但是,不保证会调用该方法。因此,您可以/应该实现它,但更重要的是,让您的应用程序检查来自您自己的服务器的新数据,以便不会遗漏任何内容。