我们(通常)成功实施了通过Azure通知中心向iOS和Android设备发送推送通知。
问题是某些iOS设备显然从未收到Azure通知中心发送的通知。
我们使用模板和标签将消息定向到适当的设备。标签是兴趣主题,绝不是特定于用户的,因此我们希望将标签的一个通知推送到订阅该标签的所有设备。
Android设备似乎完美无瑕地收到通知,但iOS设备并不一致。大多数都有效。一对夫妇没有。
我们非常清楚推送通知是尽最大努力提供的,并且不保证可靠性,但是我们的有限测试显示更多设备始终无法接收推送通知而不是看似不合理(来自大约12个设备的两次以上故障) )。
以下是设置:
我们在后端有一个简单的C#例程,它连接到Azure通知中心并向Azure发送通知:
var outcome = await hub.SendTemplateNotificationAsync(properties, tag);
我们使用GetAllRegistrationsAsync
方法确保我们检查的每个设备都已成功注册并使用正确的模板。每个设备都已注册,所有模板都是正确的。
我们不在"测试模式&#34 ;; enableTestSend
的{{1}}参数设置为False。
故障排除:
当我们发送通知时,大多数设备都会收到通知,并且在我们进行测试的特定情况下,请使用正确的号码更新徽章计数器。
但是,有几个设备似乎没有收到通知。其中一个设备在我们重新启动设备后确实收到通知,但之后就停止了。
使用上述NotificationHubClient.CreateClientFromConnectionString
方法,我们已经验证问题设备是否在Azure上正确注册,并且具有正确的标记和模板。
我们能够从Azure注册中确定问题设备的设备令牌。我们使用了一个PHP脚本,它直接与APNS通信,使用他们的设备令牌向问题设备发送通知。每次设备都会收到此直接发送通知。它只是来自Azure的通知不可靠。
当我们检查Azure Notification Hub Monitor页面时,我们会看到过去24小时内的这些指标:
...并且没有为APNS或Azure报告其他错误。我们看到的失败率应该会产生超过20的错误数。
我们无法确定哪些设备令牌会对错误负责;有没有办法从Azure获取此信息?
我们无法解释为什么我们可以通过APNS本身直接向这些设备发送通知,但不能通过Azure发送通知,以及为什么Azure不会报告比此更多的错误。< / p>
有任何建议或见解吗?
答案 0 :(得分:5)
您的数据库中很可能有一些沙箱设备令牌(我不确定设备令牌是存储在您的服务器中还是存储在Azure Notification Hub中)。尝试将带有沙盒设备令牌的通知发送到生产推送环境时,Apple会返回InvalidToken错误,并且连接已关闭。
通常,当向Apple的APN服务器发送推送通知的服务器获得错误响应时,它已经发送了更多通知(可能带有有效令牌),并且所有这些通知都被Apple丢弃。此时,Apple仅在建立与APNS的新连接后才接受新通知,因此需要重新发送在无效令牌之后发送到旧连接的消息。 Azure可能无法正确处理此重新发送。
正如您所说,Azure Notification Hub Monitor页面显示了一些错误。我怀疑3 APNS Bad Channel Errors
表示无效的设备令牌。我不知道你在数据库中实际拥有多少个无效的设备令牌,但即使有一个令牌也可能导致许多有效令牌的通知不被Apple接受。
最佳解决方案是测试数据库中的所有设备令牌,找出无效的设备令牌并将其删除。