Я заметил, что в iOS 11 beta 2 тихие уведомления не доставляются application:didReceiveRemoteNotification:fetchCompletionHandler
независимо от состояния приложения (фон / передний план).
Я реализовал UIApplicationDelegete
метод application:didReceiveRemoteNotification:fetchCompletionHandler
и отправляю следующий тихий толчок
{
"aps": {
"content-available": 1
},
"mydata": {
"foo": "bar"
}
}
но метод делегата не вызывается на iOS 11.
Он отлично работает на других версиях iOS, и в разделе документации « Настройка молчаливого уведомления» не упоминается, что нужно что-то еще делать.
Это ошибка в iOS 11 или я пропустил что-то новое в iOS 11?
Обратите внимание, что я не говорю или не использую UserNotification
фреймворк, который не нужен для отправки тихих нажатий.
Вот пример проекта, который иллюстрирует проблему (вам нужно установить свой собственный идентификатор пакета)
Когда вы запускаете пример проекта и отправляете вышеупомянутую полезную нагрузку в приложение, вы можете использовать консоль macOS, чтобы убедиться, что push-уведомление корректно доставляется на устройство, но не в приложение.
ОБНОВЛЕНИЕ 10.08
Похоже, что поведение является случайным. Иногда после перезагрузки устройства полезная нагрузка доставляется правильно, но через некоторое время перестает работать.
Как видно на следующем снимке экрана, отправка, помеченная как 1, передается только на устройство, а нажатие 2 (после перезапуска устройства) также доставляется в приложение.
ОБНОВЛЕНИЕ 14.08 - iOS 11 Beta 6
Все то же поведение. Еще одна вещь, которая должна работать, но не работает, заключается в следующем. Когда для схемы приложения установлено значение «Ожидание запуска исполняемого файла», предполагается, что тихое нажатие активирует приложение и запускает его в фоновом режиме.
ОБНОВЛЕНИЕ 21.08 - iOS 11 Beta 7
По-прежнему такое же поведение, а не обновления от Apple в отчете об ошибках.
ОБНОВЛЕНИЕ 29.08 - iOS 11 Beta 8
Все та же проблема. Шаги для воспроизведения, которые я использую сейчас, следующие:
- В схеме проекта XCode выберите «Ожидание запуска исполняемого файла»
- Добавьте точку останова в
didReceiveRemoteNotification: fetchCompletionHandler
- Запустите приложение на устройстве
- Отправить вышеуказанный тихий толчок
Ожидается : приложение переводится из приостановленного состояния в фоновое и didReceiveRemoteNotification: fetchCompletionHandler
называется
Актуально : ничего не происходит
ОБНОВЛЕНИЕ 06.09 - iOS 11 Beta 10
У меня все еще такое же глючное поведение. Билет от Apple был обновлен следующим ответом:
Отношения Apple с разработчиками 6 сентября 2017, 22:42 Engineering предоставила следующие отзывы по этой проблеме:
Мы смогли запустить пример приложения и проверить его поведение. Мы не увидели никаких проблем при тестировании, как описано.
Толчки не гарантированно поступят в приложение, когда оно работает в фоновом режиме, и логи здесь показывают, что мы не верим, что приложение используется достаточно для его запуска.
Мы видим, что время от времени мы доставляем толчки при хороших условиях.
Мы считаем, что это ведет себя правильно.
Обновление 11.09
Мой отчет об ошибках Apple был закрыт и помечен как дубликат, 33278611
который остается открытым
ОБНОВЛЕНИЕ 13.09 - iOS 11 GM
Благодаря комментариям kam800 (см. Ниже) я провел дополнительное тестирование и получил эти наблюдения:
Похоже, в iOS 11 появился новый демон, dasd DuetActivitySchedulerDaemon
который либо полностью отбрасывает передачу данных, либо задерживает доставку данных:
Доставка отложена
Консольные журналы
default 13:11:47.177547 +0200 dasd DuetActivitySchedulerDaemon CANCELED: com.apple.pushLaunch.net.tequilaapps.daylight:C03A65 <private>! lifecycle com.apple.duetactivityscheduler
default 13:11:47.178186 +0200 dasd DuetActivitySchedulerDaemon Removing a launch request for application <private> by activity <private> default com.apple.duetactivityscheduler
default 12:49:04.426256 +0200 dasd DuetActivitySchedulerDaemon Advancing start date for <private> by 6.5 minutes to Wed Sep 13 12:55:31 2017 default com.apple.duetactivityscheduler
default 13:21:40.593012 +0200 dasd DuetActivitySchedulerDaemon Activity <private>: Optimal Score 0.6144 at <private> (Valid Until: <private>) scoring com.apple.duetactivityscheduler
default 13:21:40.594528 +0200 dasd DuetActivitySchedulerDaemon Setting timer (isWaking=1, activityRequiresWaking=0) between <private> and <private> for <private> default com.apple.duetactivityscheduler
Отложенные вопросы доставки
- Когда принудительная доставка данных откладывается и приложение запускается, принудительная доставка данных доставляется только тогда, когда достигнута дата доставки, которая в будущем может составить несколько минут . Это полностью исключает необходимость использования данных, чтобы контент нового приложения был готов к следующему запуску. Я приведу здесь еще раз документацию Apple:
«Тихие уведомления улучшают работу пользователя, помогая поддерживать приложение в актуальном состоянии, даже если оно не запущено».
- Когда два отсылки данных отправляются в приостановленное приложение, они откладываются в iOS 11 вместо непосредственного пробуждения приложения. Когда время доставки достигнуто, доставляется только последний поток данных! Предыдущие запросы теряются и не доставляются с помощью метода делегата, что приводит к потере данных.
Доставка отменена
Консольные журналы
default 13:35:05.347078 +0200 dasd DuetActivitySchedulerDaemon com.apple.pushLaunch.net.tequilaapps.daylight:C03A65:[
{name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Must Not Proceed, Score: 0.00}}
], FinalDecision: Must Not Proceed} scoring com.apple.duetactivityscheduler
Отмененные проблемы с доставкой
Что ж, в этом случае передача данных полностью теряется и никогда не доставляется на iOS 11, хотя она была доставлена правильно на iOS 10.
ОБНОВЛЕНИЕ 19.09 - iOS 11 GM
Я также заметил, что когда приложение находится на переднем плане и уведомление не доставляется приложению, в консоли отображаются следующие журналы:
default 08:28:49.354824 +0200 apsd apsd <private>: Received message for enabled topic '<private>' onInterface: NonCellular with payload '<private>' with priority 10 for device token: NO courier-oversized com.apple.apsd
fault 08:33:18.128209 +0200 dasd Foundation <NSXPCConnection: 0x151eee460> connection from pid 55: Exception caught during decoding of received message, dropping incoming message.
Exception: Exception while decoding argument 0 (#2 of invocation):
Exception: value for key 'NS.objects' was of unexpected class 'NSNull'. Allowed classes are '{(
NSArray,
NSData,
NSString,
NSNumber,
NSDictionary,
NSUUID,
_DASActivity,
NSSet,
_DASFileProtection,
NSDate,
NWParameters,
NWEndpoint
)}'. general com.apple.foundation.xpc
"content-available": 1
, и приложение находится на переднем плане, обратный вызов не будет запущен.