我们从测试人员那里收到报告,指出并非所有的Apple Push Notifications都已交付。具体来说,如果在目标设备启动时发送了通知(正在启动,建立网络连接等),则永远不会收到该通知。
我了解到APNS会尽力发送通知。我仔细阅读过Apple's documentation,其中有关QoS的内容如下:
Apple Push Notification服务包括执行存储转发功能的服务质量(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"
};
如何调试/解决此问题,有人遇到过类似的行为吗?
答案 0 :(得分: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);
并从Expiry
的初始化中删除了AppleTemplateRegistrationDescription
属性:
var apnsHeaders = new Dictionary<string, string> { { "apns-priority", "10" } };
registration = new AppleTemplateRegistrationDescription(deviceUpdate.Handle, PushNotifications.IosTemplate, apnsHeaders)
{
Priority = "10"
};
看看GitHub上的Microsoft.Azure.NotificationHubs源非常有用。