如何使用 GCM 实现对 iOS 的可靠交付?
How to use GCM to achieve reliable delivery to iOS?
我正在尝试为 iOS 设备设置可靠的推送通知,并且我正在寻找有关使用 Google 云消息传递的推荐方法的指导。我的应用程序是一个消息传递应用程序,但这可能适用于其他类型的应用程序。
目前,我正在通过 HTTP 连接服务器使用 GCM,我发现如果 iOS 设备失去服务或关闭,则并非所有消息都会被传送。我相信这是预期的性能,这是因为 GCM 使用 Apple 的 APNS,它不能保证交付,遗憾的是每个应用程序队列中最多只能保存一个通知。
我希望(希望?)GCM 会拥有自己的队列来解决这个问题。也许是这样,只是我没有做对?
我遇到的其他可能性:
- Non-collapsible messages。不幸的是,文档让我困惑我是否能够使用它来实现我需要的东西。
- delivery_receipt_requested 标志。这至少可以(尽管对我来说增加了复杂性)用于确定消息是否到达。我看到它需要 XMPP。但是,如果我在具有多个 registration_ids 的单个 HTTP 请求上设置标志,也许我会得到多个 XMPP 响应?我愿意切换到使用 XMPP。如果这是推荐的路径,对于如何实施它有哪些建议?还有,这些送货单靠谱吗?
如有任何帮助,我们将不胜感激!提前致谢!!
遗憾的是,除非您在设备中实施环回,否则您无法判断您的推送通知是否已发送到 iOS 设备。但这也不会真正帮助你,因为设备可能连接不良并且仍然收到通知但你的环回请求可能无法通过,你的用户也可以关闭后台获取,这将使环回变得不可能。
因此您将无法完全解决您的问题 - 但对于大多数用户来说,使用环回是解决此问题的最佳选择。
在通知中您必须设置 content-available:1
(https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html)
并在您的 AppDelegate 中实现以下方法,并向您的服务器发出 API 消息已成功接收的请求:
- application:didReceiveRemoteNotification:fetchCompletionHandler:
您可以使用 GCM 发送所谓的数据消息。阅读此处 https://developers.google.com/cloud-messaging/server#notifications_and_data_messages
优点是它们不会像您希望的那样默认折叠。缺点是 GCM 只能通过它自己的连接传送它们,而不是通过 APNS,这意味着您的应用程序只会在 运行(即不在后台)时接收它们。如果它对您来说不够好,请考虑发送通知消息(始终通过 APNS)和数据消息的组合。
But if I set the flag on a single HTTP request with multiple registration_ids, maybe I would get back multiple XMPP responses?
没有
ALSO, are these delivery receipts reliable?
他们是最大的努力。这意味着在某些情况下(例如设备连接不良)您可能不会立即收到收据或收到重复的收据。此外,送达回执仅支持数据消息,不支持通知。
我正在尝试为 iOS 设备设置可靠的推送通知,并且我正在寻找有关使用 Google 云消息传递的推荐方法的指导。我的应用程序是一个消息传递应用程序,但这可能适用于其他类型的应用程序。
目前,我正在通过 HTTP 连接服务器使用 GCM,我发现如果 iOS 设备失去服务或关闭,则并非所有消息都会被传送。我相信这是预期的性能,这是因为 GCM 使用 Apple 的 APNS,它不能保证交付,遗憾的是每个应用程序队列中最多只能保存一个通知。
我希望(希望?)GCM 会拥有自己的队列来解决这个问题。也许是这样,只是我没有做对?
我遇到的其他可能性:
- Non-collapsible messages。不幸的是,文档让我困惑我是否能够使用它来实现我需要的东西。
- delivery_receipt_requested 标志。这至少可以(尽管对我来说增加了复杂性)用于确定消息是否到达。我看到它需要 XMPP。但是,如果我在具有多个 registration_ids 的单个 HTTP 请求上设置标志,也许我会得到多个 XMPP 响应?我愿意切换到使用 XMPP。如果这是推荐的路径,对于如何实施它有哪些建议?还有,这些送货单靠谱吗?
如有任何帮助,我们将不胜感激!提前致谢!!
遗憾的是,除非您在设备中实施环回,否则您无法判断您的推送通知是否已发送到 iOS 设备。但这也不会真正帮助你,因为设备可能连接不良并且仍然收到通知但你的环回请求可能无法通过,你的用户也可以关闭后台获取,这将使环回变得不可能。
因此您将无法完全解决您的问题 - 但对于大多数用户来说,使用环回是解决此问题的最佳选择。
在通知中您必须设置 content-available:1
(https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html)
并在您的 AppDelegate 中实现以下方法,并向您的服务器发出 API 消息已成功接收的请求:
- application:didReceiveRemoteNotification:fetchCompletionHandler:
您可以使用 GCM 发送所谓的数据消息。阅读此处 https://developers.google.com/cloud-messaging/server#notifications_and_data_messages
优点是它们不会像您希望的那样默认折叠。缺点是 GCM 只能通过它自己的连接传送它们,而不是通过 APNS,这意味着您的应用程序只会在 运行(即不在后台)时接收它们。如果它对您来说不够好,请考虑发送通知消息(始终通过 APNS)和数据消息的组合。
But if I set the flag on a single HTTP request with multiple registration_ids, maybe I would get back multiple XMPP responses?
没有
ALSO, are these delivery receipts reliable?
他们是最大的努力。这意味着在某些情况下(例如设备连接不良)您可能不会立即收到收据或收到重复的收据。此外,送达回执仅支持数据消息,不支持通知。