【问题标题】:Diagnosing dropped notifications from Azure Notification Hub to APNS诊断从 Azure 通知中心到 APNS 的丢弃通知
【发布时间】:2014-08-23 22:56:30
【问题描述】:

我们通过 Azure 通知中心(大部分)成功实现了向 iOS 和 Android 设备推送通知。

问题在于,某些 iOS 设备显然从未收到 Azure 通知中心发送的通知。

我们使用模板和标签将消息定向到适当的设备。标签是感兴趣的主题,而不是特定于用户的,因此我们希望将一个标签通知推送到订阅该标签的所有设备。

Android 设备似乎可以完美接收通知,但 iOS 设备并不一致。他们中的大多数人工作。一对夫妇没有。

我们很清楚推送通知是尽最大努力交付的,并且无法保证可靠性,但我们有限的测试表明,更多的设备始终无法接收推送通知,而不是看起来不合理(大约十几个设备的两次以上失败) )。

设置如下:

我们在后端有一个简单的 C# 例程,它连接到 Azure 通知中心并向 Azure 发送通知:

var outcome = await hub.SendTemplateNotificationAsync(properties, tag);

我们使用GetAllRegistrationsAsync 方法确保我们检查的每台设备都已成功注册并使用正确的模板。每台设备均已注册,所有模板均正确。

我们不处于“测试模式”; NotificationHubClient.CreateClientFromConnectionStringenableTestSend 参数设置为 False。

疑难解答:

当我们发出通知时,大多数设备都会收到通知,并且在我们正在测试的特定情况下,使用正确的数字更新徽章计数器。

但是,一些设备似乎没有收到通知。在我们重新启动设备后,其中一台设备确实收到了通知,但之后它就停止了。

使用上面提到的GetAllRegistrationsAsync方法,我们已经验证了问题设备在Azure上正确注册并且具有正确的标签和模板。

我们能够从 Azure 注册中确定问题设备的设备令牌。我们使用了一个直接与 APNS 通信的 PHP 脚本,使用它们的设备令牌向问题设备发送通知。每次,设备都会收到此直发通知。只有来自 Azure 的通知是不可靠的。

当我们检查 Azure Notification Hub Monitor 页面时,我们会看到过去 24 小时的这些指标:

  • 967 APNS 成功通知
  • 3 APNS 错误通道错误
  • 2 APNS 过期频道错误
  • 4 个 APNS 错误

... 一般而言,没有针对 APNS 或 Azure 报告其他错误。我们看到的故障率应该会产生超过 20 个错误计数。

我们无法确定哪些设备令牌对错误负责;有没有办法从 Azure 获取这些信息?

我们无法解释为什么我们可以通过 APNS 本身而不是通过 Azure 直接向这些设备发送通知,以及为什么 Azure 没有报告比它更多的错误。

有什么建议或见解吗?

【问题讨论】:

    标签: ios azure push-notification apple-push-notifications azure-notificationhub


    【解决方案1】:

    您的数据库中很可能有一些沙盒设备令牌(我不确定这些设备令牌是存储在您的服务器中还是存储在 Azure 通知中心中)。尝试向生产推送环境发送带有沙盒设备令牌的通知时,Apple 返回 InvalidToken 错误,并关闭连接。

    很多时候,当向 Apple 的 APN 服务器发送推送通知的服务器收到错误响应时,它已经发送了更多通知(可能带有有效令牌),而所有这些都被 Apple 丢弃了。此时,Apple 仅在与 APNS 建立新连接后才会接受新通知,因此在无效令牌之后发送到旧连接的消息需要重新发送。 Azure 可能无法正确处理此重新发送。

    如您所说,Azure 通知中心监视器页面显示了一些错误。我怀疑3 APNS Bad Channel Errors 表示无效的设备令牌。我不知道您在数据库中实际拥有多少无效设备令牌,但即使是一个也可能导致 Apple 不接受许多带有有效令牌的通知。

    最好的解决方案是测试数据库中的所有设备令牌,找出无效的设备令牌并将其删除。

    【讨论】:

    • 这似乎是一个相当合理的解释,但您的解释是否意味着我们不应该使用与 Azure 使用的完全相同的设备令牌通过 APNS 发送直接消息?或者苹果可能会根据发件人 IP(或类似的东西)有选择地拒绝传入的消息?或者,您是否知道将这些无效设备令牌从 Azure 中取出的方法? (我们不进行注册;这些设备直接与 Azure 通信。)
    • @AlanMcBee 您尝试直接发送的设备令牌可能是有效的,否则它们将永远无法工作。该问题可能是由您不知道的其他设备令牌引起的。我不知道如何从 Azure 中删除无效令牌。我从未使用过 Azure。您是否在测试开发版本(使用沙盒推送环境)时向 Azure 注册了设备?这些是最有可能出现问题的设备令牌。
    • 我们可能应该取消注册我们在测试时创建的所有预生产注册,这样就不会有任何问题。但是,所有有问题的设备在安装了生产应用程序后,都已使用生产证书成功地向 Azure 注册了它们的令牌。我预计最终会从注册中删除单个无效设备令牌。实际上,我们向 Microsoft 提供了一张支持票,以帮助追踪单个设备错误。我会继续发布这个帖子。
    • 后记。问题确实是无效的设备令牌。没有(或当时没有)一种有效的方法来检测这些沙盒令牌并删除它们;我们最终不得不注销所有令牌并重新开始。展望未来,我们将确保永远不会将相同的服务总线 + 通知中心用于生产前(沙盒)注册,就像我们为生产所做的那样。 Microsoft PM 正在/正在考虑改善的方法,但我不知道结果如何。
    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2021-04-18
    • 2018-04-28
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多