Я заметил, что в 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
Похоже, что поведение случайное. Иногда после перезапуска устройства полезная нагрузка доставляется правильно, но через некоторое время перестает работать.
Как вы можете видеть на следующем снимке экрана, push, помеченный как 1, доставляется только на устройство, а push 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 Разработчики предоставили следующие отзывы по этой проблеме:
Нам удалось запустить образец приложения и протестировать его поведение. Когда мы тестировали это, как описано, мы не обнаружили никаких проблем.
Не гарантируется, что push-уведомления поступят в приложение, когда оно работает в фоновом режиме, и журналы здесь показывают, что мы не верим, что приложение используется достаточно для его запуска.
Мы действительно видим, что время от времени при благоприятных условиях доставляем толчки.
Мы считаем, что это правильно.
Обновление 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
Проблемы с отложенной доставкой
- Когда push-доставка данных откладывается и приложение запускается, push-доставка данных доставляется только по достижении даты доставки, которая может быть несколькими минутами в будущем. Это полностью лишает смысла использование push-уведомлений для подготовки содержимого нового приложения к следующему запуску. Я еще раз цитирую документацию 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
{ "aps": { "content-available": 1 } }
, точка останова действительно будет работать в фоновом режиме, но только в фоновом режиме ... надеюсь, это немного поможет с вашим тестированием - person Dominik Bucher   schedule 07.09.2017didReceiveRemoteNotification
точке останова в режиме отладки. - person xiangxin   schedule 14.09.2017dasd
и опубликовать, что он говорит, когда ваш push получен (в приостановленном режиме) и ваша точка останова достигнута? - person Jan   schedule 14.09.2017UIApplicationExitsOnSuspend
в списке приложений, запустить приложение и нажать кнопку «Домой». Приложение сразу переводится в приостановленный режим. Когда вы отправляете тихие нажатия в это время, они не доставляются, как я упоминал в своем ОБНОВЛЕНИИ 13.09 - iOS 11 GM. - person Jan   schedule 20.09.2017was of unexpected class 'NSNull'
, после перезагрузки устройства все работало, как ожидалось - person Thomas Einwaller   schedule 21.09.2017"content-available": 1
, а приложение находится на переднем плане, обратный вызов не будет запущен. - person GoRoS   schedule 22.09.2017UIBackgroundModes
наremote-notification
в вашем листе? - person Jan   schedule 23.09.2017