iPhone启动时发送推送通知-通知未发送到设备

时间:2019-05-28 03:13:26

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

我们从测试人员那里收到报告,指出并非所有的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"
};

如何调试/解决此问题,有人遇到过类似的行为吗?

1 个答案:

答案 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源非常有用。