Отправка push-уведомления во время запуска iPhone - уведомление не доставлено на устройство - PullRequest
1 голос
/ 28 мая 2019

Мы получаем отчеты от наших тестеров о том, что не все Apple Push-уведомления доставляются. В частности, если уведомление отправляется во время запуска целевого устройства (загрузка, установление сетевого подключения и т. Д.), То уведомление никогда не будет получено .

Я понимаю, что APNS доставляет уведомления с максимальной отдачей. Я просмотрел документацию Apple , в которой говорится следующее о QoS:

Служба Apple Push Notification включает компонент качества обслуживания (QoS), который выполняет функцию сохранения и пересылки. Если APN пытается доставить уведомление, а целевое устройство находится в автономном режиме, APN сохраняет уведомление в течение ограниченного периода времени и доставляет его, когда устройство снова становится доступным. Этот компонент хранит только самые последние уведомления для каждого устройства и приложения. Если устройство находится в автономном режиме, отправка запроса уведомления, нацеленного на это устройство, приводит к отклонению предыдущего запроса. Если устройство долгое время остается в автономном режиме, все его сохраненные уведомления в APN удаляются.

Я установил apns-expiration на 90 минут, чтобы задействовать функциональность QoS.

Уведомления доставляются, когда:

  • Уведомление было отправлено, когда устройство включено и работает нормально.
  • Уведомление было отправлено во время выключения устройства (впоследствии оно доставляется через короткое время после включения устройства).

Кроме того, мы используем шаблоны уведомлений с Azure Notification Hub для интеграции с APNS. Таким образом, наша конфигурация для срока действия и приоритета APNS выглядит следующим образом:

registration = new AppleTemplateRegistrationDescription(deviceUpdate.Handle, PushNotifications.IosTemplate)
{
    Expiry = DateTimeOffset.UtcNow.AddMinutes(90).ToString("o"),
    Priority = "10"
};

Как я могу отладить / устранить эту проблему, кто-нибудь сталкивался с подобным поведением?

1 Ответ

1 голос
/ 30 мая 2019

Устранено это поведение путем добавления следующих заголовков к каждому шаблону уведомления:

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"
};

Было полезно взглянуть на источник Microsoft.Azure.NotificationHubs на GitHub.

...