【问题标题】:Should I update my app upon receiving payload? Or I should always update it by allowing it to download for itself?我应该在收到有效负载后更新我的应用程序吗?或者我应该总是通过允许它自己下载来更新它?
【发布时间】:2017-11-10 13:13:07
【问题描述】:

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

wife:
"buy pizza"

问题 1: 是不是应用程序必须下载/接收它自己。那就是手机上弹出的横幅必须自己下载+我的Whatsapp / Telegram必须自己重新下载?

朋友回复:

推送通知可以将消息作为有效负载。你的应用可以 提取并动态插入对话中 提出额外的要求——我以前做过。让人觉得 快得多。缺点是你不能保证推动 将以正确的顺序到达(或根本没有)。

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

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

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

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

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

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

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

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

WhatsApp:我什么也没得到。

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

我的结论是:

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

Gmail 和 Telegram 进行了冗余下载,基本上没有我朋友建议的那么聪明,或者没有收到电子邮件/消息的风险太大,最好是安全的 :thinking_face:

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

【问题讨论】:

  • 我对接受的答案并不满意 :(。无论如何提供赏金。至于替代答案,请参阅 here。请务必通读 cmets

标签: ios swift apple-push-notifications remote-notifications silent-notification


【解决方案1】:

首先,下载有效负载通常不是问题。我想有效负载通常非常小(短文本消息可能Creating the Remote Notification Payload

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

静默通知并不是为了让您的应用在后台保持清醒,也不是为了高优先级更新。 APNs 将静默通知视为低优先级,如果总数过多,可能会完全限制其传递。实际限制是动态的,可能会根据情况而变化,但尽量不要每小时发送超过几个通知。

请参阅Configuring a Silent Notification 了解更多信息。

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

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

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

【讨论】:

  • 没有通用答案?好的...让我说得非常具体。在省电和不重新下载东西+可靠性方面,WhatsApp、Telegram 等应用的正确方法是什么?
  • 至于你的修改建议,不知道为什么我必须走那条路。那application(_:didReceiveRemoteNotification:fetchCompletionHandler:) 是干什么用的?收到通知后不会触发吗?
  • 您可以实现该方法并让它从通知中检索/保存用户信息(我建议这样做),但有一个问题:不能保证调用该方法。见here。该方法只是为了让新消息/通知在应用内更快可用。但是,您的应用还应该检查其服务器是否有新数据。
  • 什么意思?
  • 我看到了你提供的链接(同样,我以前读过它)。你觉得哪一部分相关?
猜你喜欢
  • 2012-10-21
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 1970-01-01
  • 2018-08-15
相关资源
最近更新 更多