Я заметил, что на iOS 11 beta 2 тихие уведомления не передаются в application:didReceiveRemoteNotification:fetchCompletionHandler
независимо от состояния приложения (фон/передний план).
Я реализовал метод UIApplicationDelegete
application:didReceiveRemoteNotification:fetchCompletionHandler
, и я посылаю следующий тихий push
{
"aps": {
"content-available": 1
},
"mydata": {
"foo": "bar"
}
}
но метод делегата не вызывается в iOS 11.
Он отлично работает в других версиях iOS, а раздел документации "Настройка бесшумного уведомления" не упоминает, что что-то еще нужно сделать.
Является ли это ошибкой в iOS 11 или я пропустил что-то новое в iOS 11?
Обратите внимание, что я не говорю и не использую структуру UserNotification
, которая не нужна для отправки тихих нажатий.
Вот пример пример проекта, который иллюстрирует проблему (вам нужно будет установить свой собственный идентификатор пакета)
Когда вы обедаете образец проекта и отправляете вышеприведенную полезную нагрузку в приложение, вы можете использовать консоль macOS, чтобы убедиться, что нажатие правильно доставлено на устройство, но не в приложение.
ОБНОВЛЕНИЕ 10.08
Похоже, что поведение случайное. Иногда после перезапуска устройства полезная нагрузка поставляется правильно, но через некоторое время она перестает работать.
Как вы можете видеть на следующем снимке экрана, push, помеченный как 1, отправляется только на устройство, а push 2 (после перезагрузки устройства) также доставляется в приложение.
ОБНОВЛЕНИЕ 14.08 - бета-версия iOS 11
По-прежнему такое же поведение. Другое дело, что должно работать, но не так. Когда для схемы приложения установлено значение "Ожидание запуска исполняемого файла", тихий push должен пробудить приложение и запустить его в фоновом режиме.
ОБНОВЛЕНИЕ 21.08 - iOS 11 Beta 7
По-прежнему такое же поведение, а не обновление от Apple в отчете об ошибке.
ОБНОВЛЕНИЕ 29.08 - бета-версия iOS 11
По-прежнему та же проблема. Ниже приведены шаги для воспроизведения, которые я использую:
- В схеме проекта Xcode выберите "Подождите, пока исполняемый файл будет запущен"
- Добавить точку останова в
didReceiveRemoteNotification: fetchCompletionHandler
- Запустите приложение на устройстве
- Отправляйте отключенное нажатие кнопки
Ожидаемое: приложение переводится из приостановленного состояния в фоновое и didReceiveRemoteNotification: fetchCompletionHandler
называется
Фактический: ничего не происходит
ОБНОВЛЕНИЕ 06.09 - iOS 11 Beta 10
У меня все еще такое же плохое поведение. Билет от Apple был обновлен следующим ответом:
Отношения с разработчиками Apple 6 сентября 2017, 10:42 предоставили следующую информацию по этой проблеме:
Нам удалось запустить приложение примера и проверить его поведение. Мы не видел никаких проблем, когда мы тестировали это, как описано.
Точки не гарантированно прибудут в приложение, когда оно запущено в фон и журналы здесь показывают, что мы не считаем, что приложение достаточно для его запуска.
Мы видим, что мы время от времени нажимаем на то, когда условия хорошо.
Мы считаем, что это ведет себя правильно.
Обновление 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