4
  • 在我们的应用程序中,我们使用推送通知通知用户,但如果用户没有收到推送(例如用户的设备离线),那么我们会向他发送短信。
  • 由于 APNs 不提供交付报告,我们实现了自己的使用服务扩展向后端服务器发送报告的方法:

    • 当应用程序收到推送通知时,它会在服务扩展的方法中向后端发送一个 http-request -

      didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void)

可以在 30 秒内完成获取作业或发出 http 请求。

但是,有时用户会抱怨同时接收 SMS 和 PUSH。

当我们检查 DB 中的日志时,没有来自这些设备的 PUSH 交付报告。

我的问题是:

  1. 服务扩展是否有可能无法启动?
  2. 有关如何解决此类错误的任何建议?
4

2 回答 2

0

在您的应用程序中,您可能在应用程序的目标功能中启用了后台模式远程通知以及服务扩展。所以发生的事情是,当您收到推送通知时,您的应用程序处于活动状态大约 30 秒。在这段时间内,您的送货服务会被调用并更新您的服务器。由于通知不包含任何媒体,因此显示通知需要一些时间。

但是,一旦您收到货品,您的服务器就会向用户发送一条短信。这就是您同时获得 APN 和 SMS 的原因。

修复:在您的服务器上添加延迟发送 SMS 大约 1 分钟。以免发生冲突。

于 2018-09-07T13:09:53.713 回答
0

在服务扩展中打电话回家的想法是有缺陷的,因为如果由于某种原因 HTTP 调用在扩展中失败(例如,坏的单元格接收,服务器打嗝,......)你无法阻止通知被传递:

服务扩展 [..] 无权删除此通知或阻止其显示。

如本 WWDC 17 演讲中所述:最佳实践和用户通知中的新功能

更好的方法是向用户发送静默通知。这将在用户设备的后台唤醒您的应用程序,允许您进行 HTTP 调用。如果呼叫成功,您可以安排本地通知。如果失败(或者如果从未发送过静默通知),则用户处于离线状态,您可以改为发送 SMS。

请记住:Apple 将静默通知视为低优先级,因此为了防止在发送 SMS后发送的静默通知安排本地通知,您应该实现某种 API 调用,您的应用可以使用该 API 调用来查询是否或尚未发送 SMS。

于 2019-01-26T00:13:54.397 回答