【发布时间】:2019-10-13 12:42:01
【问题描述】:
我们从我们的测试人员那里得到报告,称并非所有 Apple 推送通知都已交付。具体来说,如果在目标设备启动时发送通知(启动、建立网络连接等),则永远不会收到通知。
我了解 APNS 会尽最大努力提供通知。我仔细阅读了Apple's documentation,其中提到了关于 QoS 的以下内容:
Apple 推送通知服务包括一个执行存储和转发功能的服务质量 (QoS) 组件。如果 APNs 尝试发送通知并且目标设备处于离线状态,则 APNs 会在有限的时间段内存储通知,并在设备再次可用时发送通知。此组件仅存储每个设备和每个应用程序的最新通知。如果设备离线,发送针对该设备的通知请求会导致先前的请求被丢弃。如果设备长时间处于离线状态,则其在 APN 中存储的所有通知都将被丢弃。
我已将apns-expiration 设置为 90 分钟以启用 QoS 功能。
通知在以下时间发送:
- 在设备开启并正常运行时发送通知。
通知是在设备关闭时发送的(随后在设备打开后不久发送)。
顺便说一句,我们正在使用带有 Azure 通知中心的模板通知来与 APNS 集成。因此,我们的 APNS 过期和优先级配置如下所示:
registration = new AppleTemplateRegistrationDescription(deviceUpdate.Handle, PushNotifications.IosTemplate)
{
Expiry = DateTimeOffset.UtcNow.AddMinutes(90).ToString("o"),
Priority = "10"
};
我该如何调试/解决这个问题,有没有人遇到过类似的行为?
【问题讨论】:
-
请查看这篇文章,该文章有助于确定通知可能会被丢弃或无法被设备接收的原因。它还解释了如何确定根本原因。如果您还没有检查过,请尝试文档中列出的步骤以开始并隔离问题 -docs.microsoft.com/en-us/azure/notification-hubs/…
-
谢谢@AjayKumar-MSFT,这篇文章很方便。如果我升级到标准层,我可以查询 Per Message Telemetry API。你能告诉我我是否正确设置了 apns-expiration 标头吗?
-
通常这样设置: var notification = new AppleNotification("json payload"); notification.Headers["X-Apns-Priority"] = "5"; // 或“10”,即默认值 notification.Expiry = DateTime.UtcNow.AddHours(1); await hub.SendNotificationAsync(notification /* , optional-tags */);您可以在这里找到更多示例 -azure.microsoft.com/en-us/blog/…
-
再次感谢,我想我很挣扎,因为
TemplateNotification类没有Expiry 属性来控制apns-expiration,这很公平。您链接的有关apns-priority标头的文章提供了宝贵的线索。事实上,更好的解决方案是在模板注册中标记过期。即registration.Expiry = "$(Expiry)";。我要试试这个。
标签: ios apple-push-notifications azure-notificationhub