【问题标题】:Sending a push notification while iPhone is starting up - notification not delivered to device在 iPhone 启动时发送推送通知 - 通知未发送到设备
【发布时间】: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


【解决方案1】:

通过向每个模板通知添加以下标头来解决此问题:

var templateProperties = new Dictionary<string, string> {
    // omitted
};

var notification = new TemplateNotification(templateProperties);

notification.Headers.Add("ServiceBusNotification-Apns-Expiry", DateTimeOffset.UtcNow.AddDays(7).ToString("yyyy-MM-ddTHH:mmzzz"));
notification.Headers.Add("apns-expiration", DateTimeOffset.UtcNow.AddDays(7).ToUnixTimeSeconds().ToString());

await hubClient.SendNotificationAsync(notification, destinationTags);

并从AppleTemplateRegistrationDescription的初始化中删除了Expiry属性:

var apnsHeaders = new Dictionary<string, string> { { "apns-priority", "10" } };
registration = new AppleTemplateRegistrationDescription(deviceUpdate.Handle, PushNotifications.IosTemplate, apnsHeaders)
{
    Priority = "10"
};

看看 GitHub 上的 Microsoft.Azure.NotificationHubs 源代码很有用。

【讨论】:

  • 很高兴知道问题已解决。感谢您分享适合您的解决方案。
猜你喜欢
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 2017-01-08
  • 2017-10-04
  • 1970-01-01
  • 2015-09-02
  • 2011-04-25
  • 2017-12-07
相关资源
最近更新 更多