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

Should I update my app upon receiving payload? Or I should always update it by allowing it to download for itself?

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

wife:
"buy pizza"

问题 1: 应用程序是否必须 download/receive 本身 。那就是 phone 上弹出的横幅必须自行下载 + 我的 Whatsapp/Telegram 必须再次自行下载?

我朋友回复:

Push notifications can have the message as a payload. Your app could extract that and dynamically insert into the conversation without making an additional request - I've done that before. Makes it feel much snappier. The downside is that you're not guaranteed that pushes will arrive in the correct order (or at all).

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

为了看看顶级公司和他们的应用程序是否应用了我朋友建议的内容,我用 3 个应用程序(Gmail、WhatsApp、Telegram)做了一个小实验:

我关闭了 Wifi,但保持蜂窝数据打开,然后我还禁用应用程序使用蜂窝数据的访问。

然后有人给我发了一个 message/email: 这是我的结果:

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

但是,如果允许 Telegram 访问互联网……它会在后台下载消息……也就是说,如果我遵循此 顺序:我是 wifi 或移动网络没有互联网限制的数据 --> 收到通知 --> 完全关闭互联网然后转到应用程序:我会在那里看到完整的 message/body。

Gmail: 我收到一条提醒(有 subject/sender/body 的预览)但是一旦我打开应用程序,它就没有我的新消息或任何东西.

如果允许 Gmail 应用程序访问互联网……则与 Telegram 相反:直到打开应用程序本身,它才会 download/update Gmail 中的电子邮件。我猜 Gmail 没有将 content-available 设置为 1 但 Telegram 将其设置为 1

WhatsApp:我什么都没收到。

收到通知后不会发生任何交互......只有当应用程序正在下载时才会发生本身

我的结论是:

收到通知后不会发生任何交互......只有当应用程序正在下载自身时才会发生,而与负载到达无关。

Gmail 和 Telegram 正在进行冗余下载,基本上不够聪明,无法按照我朋友的建议或未收到 email/message 的风险太大,最好安全起见:thinking_face:

问题2:这个结论正确吗?

首先,下载有效载荷通常不是问题。我想有效负载通常非常小(对于短文本消息可能 <1Kb)。事实上,常规远程负载的最大大小为 4KB(VoIP 通知为 5KB)。参见 Creating the Remote Notification Payload

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

Silent notifications are not meant as a way to keep your app awake in the background, nor are they meant for high priority updates. APNs treats silent notifications as low priority and may throttle their delivery altogether if the total number becomes excessive. The actual limits are dynamic and can change based on conditions, but try not to send more than a few notifications per hour.

有关详细信息,请参阅 Configuring a Silent Notification

应用可以 "download" 在接收到远程通知时进行远程通知的另一种可能方式在 Modifying the Payload of a Remote Notification 中进行了描述。您可以简单地保存通知并选择不修改它们。

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

编辑:您还应该从通知的用户信息中实现 application(_:didReceiveRemoteNotification:fetchCompletionHandler:) 和 retrieve/save 数据,以便在您的应用中更快地使用数据.但是,不能保证调用该方法。所以你 could/should 实施它,但更重要的是,让你的应用检查来自你自己的服务器的新数据,这样就不会遗漏任何内容。