诊断从Azure通知集线器丢弃的通知到APNS

我们通过Azure通知集线器(通常)成功实现了向iOS和Android设备发送推送通知。

问题是,有些iOS设备显然从来没有收到由Azure通知集线器发送的通知。

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

Android设备似乎完美地接收他们的通知,但iOS设备不一致。 他们大多数工作。 一对夫妇不。

我们很清楚推送通知是尽力而为,并不能保证可靠性,但是我们有限的testing揭示了更多的设备始终无法接收推送通知,而不是似乎不合理的(两个以上的设备有两个以上的故障)。

这是设置:

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

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

我们已经使用GetAllRegistrationsAsync方法来确保我们正在检查的每个设备已经成功注册并使用了正确的模板。 每个设备都被注册,所有的模板都是正确的。

我们不在“testing模式”; NotificationHubClient.CreateClientFromConnectionStringenableTestSend参数设置为False。

故障排除:

当我们发送通知时,大多数设备都会收到通知,在特定情况下我们正在testing,请更新徽章计数器的正确编号。

但是,有几个设备似乎没有收到通知。 其中一台设备在重新启动设备后得到通知,但之后停止。

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

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

当我们检查Azure通知中心监控页面时,我们会看到过去24小时的这些指标:

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

…没有其他错误报告的APNS或一般的Azure。 我们所看到的失败率应该会超过20。

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

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

任何build议或见解?

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

通常情况下,向Apple的APN服务器发送推送通知的服务器获得错误响应时,它已经发送了更多的通知(可能带有有效的标记),并且所有这些通知都被Apple丢弃。 此时,只有在build立了与APNS的新连接后,Apple才能接受新通知,因此需要重新发送在无效标记之后发送到旧连接的消息。 Azure可能无法正确处理此重新发送。

如您所说,Azure通知集线器监视器页面显示一些错误。 我怀疑3 APNS Bad Channel Errors是指无效的设备令牌。 我不知道你在数据库中有多less无效的设备令牌,但即使有一个有可能会导致许多有效令牌的通知不被苹果接受。

最好的解决办法是testing数据库中的所有设备令牌,找出那些无效的设备令牌并删除它们。