Тихие нажатия не доставляются в приложение на iOS 11

Я заметил, что в 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

person Jan    schedule 28.06.2017    source источник
comment
Я вижу ту же проблему.   -  person pds    schedule 01.07.2017
comment
какую полезную нагрузку вы отправляете?   -  person hariszaman    schedule 14.08.2017
comment
@hariszaman тот, что в оригинальном посте   -  person Jan    schedule 14.08.2017
comment
@ Ян, да, ты прав. Я проверил это, и поведение случайное. Если приложение находится на переднем плане, это может быть одно уведомление, но если оно фоновое, оно не получает никаких уведомлений. Можете ли вы добавить ссылку на кейс, который вы открыли в Apple   -  person hariszaman    schedule 14.08.2017
comment
То же самое и с iOS 11 beta 6. Я обновил главный вопрос. Я не могу ссылаться на отчет об ошибке, так как они являются частными и доступны только Apple   -  person Jan    schedule 14.08.2017
comment
@Jan, пожалуйста, будьте в курсе. У меня есть интересное наблюдение, хотя, если ваше устройство подключено к отладчику и работает с профилем разработки, я могу отлично получать тихие уведомления, но как только я отсоединяю отладчик, уведомления не отправляются   -  person hariszaman    schedule 16.08.2017
comment
Все еще не исправлено в Beta 8 .......   -  person Justin Stanley    schedule 29.08.2017
comment
да, я обновил свой исходный пост, добавив дополнительные шаги для воспроизведения. Я также обновил сообщение об ошибке в Apple   -  person Jan    schedule 29.08.2017
comment
все еще не исправлено в бета-версии 8, когда я смотрю в консоль, я вижу следующую ошибку: ‹NSXPCConnection: 0x123f43620› соединение с pid 58: исключение во время декодирования полученного сообщения, отбрасывание входящего сообщения. Исключение: исключение при декодировании аргумента 0 (№2 вызова): исключение: значение для ключа NS.objects имело неожиданный класс NSNull. Допустимые классы: {(NWParameters, NWEndpoint, NSArray, NSData, NSString, NSNumber, NSDictionary, NSUUID, _DASActivity, NSSet, _DASFileProtection, NSDate)}.   -  person Thomas Einwaller    schedule 29.08.2017
comment
Я не вижу этого сообщения об ошибке в консоли. Вы отправляете ту же полезную нагрузку, что и в исходном сообщении?   -  person Jan    schedule 29.08.2017
comment
Неважно, что я отправляю, если он содержит content-available: 1 - но да, я также получаю эту ошибку с отправкой именно полезной нагрузки исходного сообщения   -  person Thomas Einwaller    schedule 29.08.2017
comment
Я бы осторожно сказал, что в iOS 111 Beta 9 это выглядит лучше - первые тесты выглядят многообещающими   -  person Thomas Einwaller    schedule 31.08.2017
comment
пробовали ли вы использовать ожидание запуска исполняемого файла в схеме для имитации приложения в приостановленном режиме (см. Обновление 14.08 выше)? В моем случае это все еще не работает.   -  person Jan    schedule 01.09.2017
comment
@Jan да, думаю, я был слишком рано со своими празднованиями - это все еще не исправлено: /   -  person Thomas Einwaller    schedule 04.09.2017
comment
Здравствуйте, я недавно боролся с этой ошибкой ... Ошибка возникает только тогда, когда вы отправляете что-то еще с полезной нагрузкой. Если вы отправите только этот json { "aps": { "content-available": 1 } }, точка останова действительно будет работать в фоновом режиме, но только в фоновом режиме ... надеюсь, это немного поможет с вашим тестированием   -  person Dominik Bucher    schedule 07.09.2017
comment
Для меня сценарии следующие: При отладке работают как передний план, так и фон (точка останова на didReceiveRemoteNotification). При подписании с помощью ad hoc передний план никогда не работал. Удаленное тихое нажатие доставляется в фоновом режиме, didReceiveRemoteNotification запускается только в том случае, если пользователь запускает приложение, нажав на уведомление. Последовательное поведение во всех бета-версиях, включая GM. :(   -  person xiangxin    schedule 14.09.2017
comment
@xiangxin Все это обсуждение посвящено тихим пушам, поэтому ваш случай, когда пользователь нажимает на уведомление, неуместен. Вы пытались отправить тихий push, когда приложение приостановлено?   -  person Jan    schedule 14.09.2017
comment
@DominikBucher, удаление кастомной полезной нагрузки для меня ничего не изменило   -  person Jan    schedule 14.09.2017
comment
@Jan Да, я прикрепил заголовок предупреждения к своему тихому push-уведомлению (хотя я не должен этого делать), просто чтобы убедиться, что уведомление отправлено успешно. Потому что я даже не могу найти журнал полезной нагрузки push-уведомлений в моей консоли или журнале устройства xcode. Я не могу точно сказать, приостановлено ли мое приложение или находится в фоновом состоянии, когда я отправляю push. Обновление: с новым GM xcode 9 (9A235) и iOS 11 (15A372) мое приложение больше не останавливается на didReceiveRemoteNotification точке останова в режиме отладки.   -  person xiangxin    schedule 14.09.2017
comment
@Jan, какую версию xcode вы используете? Я был на xcode 8, и все работало нормально ...   -  person Dominik Bucher    schedule 14.09.2017
comment
@DominikBucher Я пробовал Xcode 8 и 9, но работал под управлением iOS 11.   -  person Jan    schedule 14.09.2017
comment
@xiangxin, поэтому имитируйте приостановленный режим, в котором тихий толчок должен вернуть приложение в фоновый режим, вы можете использовать Ожидание запуска исполняемого файла в настройке схемы (см. мой исходный пост)   -  person Jan    schedule 14.09.2017
comment
@Jan Я тоже, и это сработало в обоих случаях ... Вы пробовали это в фоновом режиме? когда вы отправляете уведомление без ненужной полезной нагрузки, точка останова должна остановиться, но только когда вы находитесь на трамплине с отладчиком, прикрепленным к приложению ... Я на 100% уверен в этом ..   -  person Dominik Bucher    schedule 14.09.2017
comment
@DominikBucher только что попробовал, и без полезной нагрузки поведение не меняется. Можете ли вы использовать консоль macOS, отфильтровать dasd и опубликовать, что он говорит, когда ваш push получен (в приостановленном режиме) и ваша точка останова достигнута?   -  person Jan    schedule 14.09.2017
comment
Итак, выпущена iOS 11, похоже, такая же сборка, что и GM. Другими словами, проблема все еще возникает, поэтому тихие нажатия не работают на iOS 11.   -  person Jan    schedule 19.09.2017
comment
Еще один простой способ воспроизвести это - установить ключ UIApplicationExitsOnSuspend в списке приложений, запустить приложение и нажать кнопку «Домой». Приложение сразу переводится в приостановленный режим. Когда вы отправляете тихие нажатия в это время, они не доставляются, как я упоминал в своем ОБНОВЛЕНИИ 13.09 - iOS 11 GM.   -  person Jan    schedule 20.09.2017
comment
сегодня снова провел некоторое тестирование с iOS 11 (15A372) - у меня постоянно возникала ошибка was of unexpected class 'NSNull', после перезагрузки устройства все работало, как ожидалось   -  person Thomas Einwaller    schedule 21.09.2017
comment
да точно, через некоторое время запускается снова: /   -  person Jan    schedule 21.09.2017
comment
Имея точно такие же проблемы - @xiangxin сказал, только когда подписан специальным сертификатом. Вы видите правильное поведение при подписании с производственным сертификатом? т.е. пуши принимаются в активном состоянии, как и ожидалось. Это поведение у вас только через сертификат Xcode / ad-hoc?   -  person MagicFlow    schedule 22.09.2017
comment
Я получаю тот же результат с iOS 11 (не ранее), если я отправлю с push с "content-available": 1, а приложение находится на переднем плане, обратный вызов не будет запущен.   -  person GoRoS    schedule 22.09.2017
comment
@GoRoS у вас установлен UIBackgroundModes на remote-notification в вашем листе?   -  person Jan    schedule 23.09.2017
comment
Ну конечно; естественно. И, как указано в комментариях выше, перезагрузка устройств до сих пор решала проблему, что, честно говоря, сводит меня с ума.   -  person GoRoS    schedule 23.09.2017
comment
Сертификат выпуска @MagicFlow ведет себя так же, как и специальный сертификат. Последнее обновление для меня: при отладке работает как передний, так и задний план. При подписании с сертификатом adhoc / release, передний план работает; фон нет. Я отправил отчет об ошибке с журналами 34489256, но был отмечен как дублированный как 33278611.   -  person xiangxin    schedule 23.09.2017
comment
спасибо @xianxin, каков общий консенсус, кажется ли это то, что Apple исправит? Удивительный баг - бесшумные нажатия оказывались бесполезными.   -  person MagicFlow    schedule 24.09.2017
comment
Есть ли способ обхода этой ситуации? потому что я не вижу решения в ближайшем будущем   -  person DaNLtR    schedule 24.09.2017
comment
Я тестировал это поведение и в последние недели безуспешно .... к моему замешательству, приложение (: didReceiveRemoteNotification: fetchCompletionHandler :) снова работает. - ›Прочитав примечания к выпуску, я дополнительно добавил в свой код следующую пустую функцию: application ( application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -› Void). Я не уверен на 100%, связано ли это с проблемой, но вы можете попробовать - он работает как на переднем плане, так и в фоновом режиме.   -  person AlexWoe89    schedule 24.09.2017
comment
Я открыл поток также в stackoverflow и ответил на свой вопрос здесь: stackoverflow.com/questions/46330053/   -  person AlexWoe89    schedule 24.09.2017
comment
Я открыл еще один отчет об ошибке с Apple - это полностью сломало наше приложение.   -  person Lee    schedule 26.09.2017
comment
@Lee, было бы здорово, если бы вы также могли присоединиться к нашему групповому чату, давайте посмотрим, какие ответы Apple: chat.stackoverflow.com/rooms/155203/   -  person AlexWoe89    schedule 26.09.2017
comment
Кажется, исправлено в iOS 11.0.1 (хотя все еще не работает на High Sierra).   -  person JanApotheker    schedule 27.09.2017
comment
@JanApotheker - нет, это не исправлено. просто проверил это   -  person AlexWoe89    schedule 27.09.2017
comment
@JanApotheker, это не исправлено в iOS 11.0.1. Я связался с Apple, и они сказали, что это ошибка. Также я понимаю, что проблема в том, что ОС отменяет запуск приложения в фоновом режиме. iPhone dasd (DuetActivitySchedulerDaemon) [153] ‹Notice›: Удаление запроса на запуск приложения ‹private› по активности ‹private›   -  person Chinthaka    schedule 27.09.2017
comment
Ok. По крайней мере, push-доставка на переднем плане у меня снова работает (что было сломано в iOS 11 GM). Кто-нибудь еще тестировал его с бета-версией 11.1?   -  person JanApotheker    schedule 28.09.2017
comment
Новая бета-версия iOS11.1 содержит исправление для этого.   -  person Lee    schedule 28.09.2017
comment
После тестирования с новой бета-версией 1 iOS11.1 выяснилось, что теперь это исправлено и работает, как и раньше, на iOS 10.   -  person Lee    schedule 28.09.2017
comment
У меня похожие проблемы с iOS 11.0.1. Это сложно проверить, потому что кажется, что иногда толчки действительно доставляются, хотя и с опозданием. И когда они есть, делегат не вызывается.   -  person shadowmoses    schedule 28.09.2017
comment
@shadowmoses, вам стоит попробовать 11.1 beta   -  person AlexWoe89    schedule 29.09.2017
comment
Я только что протестировал 11.1 beta 1, и в моем случае проблема НЕ была исправлена. Первое уведомление пришло сразу, следующие с задержкой, как в 11.0   -  person txulu    schedule 29.09.2017
comment
та же проблема здесь, используя отладчик, уведомление приходит немедленно, без отладчика (через Wi-Fi или кабель) уведомление даже не приходит ... кто-то там решает эту проблему?   -  person ilmetu    schedule 12.10.2017
comment
Похоже, у Whatsapp была аналогичная проблема whatsappen. ru / news / 5465 / Что-то о пользователях, которые обычно принудительно закрывают свои приложения, а это большинство разработчиков ...   -  person toxaq    schedule 22.10.2017
comment
@Sausagedioxide Маркер push может быть изменен в любое время, и это задокументировано. Он все время менялся после переустановки приложения. Это не по теме, поскольку не связано с доставкой уведомлений.   -  person Jan    schedule 22.10.2017
comment
@Gruntcakes Я не думаю, что какое приложение использует remoteNotifications для своих push-уведомлений, чтобы уведомить пользователя   -  person AlexWoe89    schedule 23.10.2017
comment
Я предполагаю, что WhatsApp использует PushKit, который более надежен и обеспечивает VoIP. Но весь этот разговор в WhatsApp не по теме   -  person Jan    schedule 23.10.2017
comment
По-прежнему проблемы в 11.1 B5: для меня легко воспроизвести проблемы с тихим нажатием, когда приложение находится на переднем плане с Beta 5 - a) снизьте мощность до менее 20%, а затем они не будут доставлены (даже если устройство подключен к источнику питания) б) если заряд батареи составляет около 35% и пользователь также включил режим низкого энергопотребления, то они не доставляются в) изменить значения приоритета и истечения срока действия после того, как ранее было отправлено несколько нажатий с разными значениями, кажется, иногда останавливается он не работает, пока устройство не будет перезагружено. Однако в фоновом режиме с 11.1 ситуация улучшилась.   -  person Gruntcakes    schedule 27.10.2017
comment
Очевидно, что с 11.1 Beta 5. все еще существуют проблемы. Я много дней тщательно тестировал. В частности, когда приложения находятся на переднем плане, толчки могут просто перестать доставляться. Что интересно, если они остановятся для приложения A, тогда в то же время они могут продолжить работу для приложения B. Но в другое время или день приложение B может не работать, а приложение A работает. Подразумевая, что, а также факторы устройства, влияющие на доставку (заряд батареи, зарядка, включенный Wi-Fi и т. Д.), Каждое приложение также может иметь некоторый бюджетный лимит. Apple ранее документировала, что есть бюджеты push-уведомлений устройств, теперь могут быть также бюджеты push-уведомлений приложений.   -  person Gruntcakes    schedule 28.10.2017
comment
И точно так же с публичным выпуском 11.1. Если вы используете тихие нажатия и ваше приложение находится на переднем плане, не ожидайте, что они будут доставлены в зависимости от нескольких вещей, но в первую очередь от уровня заряда батареи, даже если устройство подключено к источнику питания.   -  person Gruntcakes    schedule 01.11.2017
comment
Кажется, проблема все еще появляется в iOS 11.2.6.   -  person Gopik    schedule 18.07.2018
comment
У меня такая же проблема в версии 11.4.1   -  person US-1234    schedule 03.08.2018
comment
@Jan, отличный ответ и продолжение последних версий iOS. У вас была возможность протестировать это на iOS 12?   -  person Hugo Allexis Cardona    schedule 26.03.2019
comment
У меня возникла эта проблема на iOS 14 и 14.2 Beta. Ни одного фонового нажатия, даже если оставить его на 24 часа.   -  person malhal    schedule 23.09.2020
comment
Ответ в этом сообщении сработал для меня: stackoverflow.com/a/64690793/451383   -  person Dr TJ    schedule 05.11.2020


Ответы (14)


Итак, в примечаниях к выпуску iOS 11.1 beta 1 говорится:

iOS 11.1 beta 1 только что была выпущена, и они упоминают: «Уведомления. Устраненные проблемы • Тихие push-уведомления обрабатываются чаще. (33278611)

Я провел несколько тестов, и, похоже, это действительно исправлено:

Приостановленное состояние

Когда я запускаю приложение в приостановленном режиме и отправляю тихий push, приложение возвращается в фоновый режим и вызывается делегат didReceiveRemoteNotification:fetchCompletionHandler.

Состояние переднего плана

Точно так же, когда приложение находится на переднем плане и отправляется тихая отправка, делегат, кажется, вызывается должным образом. Это случайным образом не работало в предыдущих версиях iOS 11, поэтому я подтвердю это после дополнительных испытаний.

person Jan    schedule 27.09.2017
comment
На первых тестах я думал, что это исправлено. Какое-то время это работало. Но после некоторых тяжелых испытаний все начало падать. Внезапно он перестал вызывать делегата для каждого тихого нажатия, даже когда приложение было на переднем плане. По-видимому, эта новая система дуэтов блокирует вызов делегата моего приложения из-за нехватки energyBudget. Так что, к сожалению, до сих пор не исправлено. - person Abras; 28.09.2017
comment
невероятный :( - person Thomas Einwaller; 28.09.2017
comment
Мой опыт такой же, как у Абраса выше. Поработал какое-то время, потом развалился, и куратора больше не вызывали - это отстой, - person Lee; 28.09.2017
comment
После дополнительных тестов мне удалось найти способ снова заставить устройство получать уведомления. Подключите его к источнику питания. Как только вы подключите устройство к источнику питания, оно снова начнет получать все удаленные уведомления. Если его отключить, то он останавливается. В этом нет смысла, потому что во всех моих тестах приложение было на переднем плане. А передовые приложения гарантированно получают удаленные уведомления. - person Abras; 28.09.2017
comment
для меня все работает хорошо, даже когда используется сотовая связь без подключения к источнику питания. Только когда я устанавливаю устройство в режим энергосбережения, я не получаю толчков даже на переднем плане. Но это то, что я понимаю - person Jan; 28.09.2017
comment
Спасибо, Ян. Мы также протестируем и свяжемся с вами ... это действительно хорошие новости ... и надеюсь, что это правда. - person James L Harris; 28.09.2017
comment
В режиме низкого энергопотребления удаленные уведомления всегда отключены. Даже на iOS 10. Это правильное поведение. После того, как батарея моего устройства достигла 100%, оно снова начало получать удаленные уведомления, даже без подключения к источнику питания. - person Abras; 28.09.2017
comment
тестирование на ios 11.1 (бета скачанная с сайта разработчика) у меня работает. Я не вижу Must Not Proceed решений, как раньше, в уведомлении каждый раз появляется Can Proceed. - person Shankari; 01.10.2017
comment
Обратите внимание, что уведомление кажется немного задержанным (~ 10-15 минут) с момента его отправки. github.com/e-mission/e-mission- телефон / вопросы / - person Shankari; 01.10.2017
comment
@Jan Знаете ли вы, есть ли у Apple дата выпуска бета-версии iOS11.1? - person AlexWoe89; 05.10.2017
comment
Что ж, iOS 11.1 beta 1 уже выпущена для разработчиков. Если вы имеете в виду дату выпуска 11.1 (не бета), я не знаю - person Jan; 05.10.2017

Просто хотел добавить сюда свои 2 цента, так как я тоже столкнулся с этой проблемой, и я заметил, что Apple закрыла несколько радаров по этой проблеме, заявив, что они не могут воспроизводить. Я обнаружил интересную вещь: push-уведомления будут доставлены, если приложение находится в фоновом режиме, пока оно подключено к отладчику.

Если я убью отладчик, отключу свой телефон, запустите приложение и отправлю полезную нагрузку без вывода сообщений, я вижу, что приложение НЕ просыпается. В журнале консоли я вижу, что система отменяет доставку полезных данных в мое приложение.

Я отправил радар с небольшим примером приложения, которое воспроизводит проблему. Я также явно отметил в радаре, что человек, работающий над моим билетом, не должен запускать приложение, прикрепленное к отладчику, чтобы воспроизвести проблему. Вот ссылка: https://bugreport.apple.com/web/?problemID=34461063

Надеюсь, это приведет к некоторому прогрессу в этом вопросе.

person Bill Dunay    schedule 15.09.2017
comment
Спасибо за отчет. Кстати, связывание ошибки Apple здесь не поможет, поскольку они являются частными, и их могут видеть только репортер и Apple. - person Jan; 19.09.2017
comment
Я бы хотел, чтобы больше людей использовали openradar.appspot.com, чтобы мы могли отслеживать радары других людей - person Thomas Einwaller; 21.09.2017
comment
есть ли какие-либо обновления в вашем отчете об ошибке с apple @bill - person MagicFlow; 22.09.2017
comment
Я не получал обновлений на моем радаре от Apple, но мы установили бета-версию iOS 11.1, и, похоже, проблема решена. - person Bill Dunay; 06.10.2017
comment
Да, мы также сталкиваемся с той же проблемой в iOS 11.2.6. Какие-нибудь решения или обновления? - person Gopik; 18.07.2018
comment
@Gopik, я тоже сталкиваюсь с той же проблемой, если вы найдете какое-либо решение, пожалуйста, помогите мне. - person Yogendra Patel; 11.07.2019

Похоже, новое поведение iOS 11. iOS 11 beta 10 содержит несколько описательных журналов, касающихся этой проблемы:

default 23:18:51.806011 +0200   dasd    com.apple.pushLaunch.com.acme.Acme:F7E7D0:[
    {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Can Proceed, Score: 0.50}}
    {name: BatteryLevelPolicy, policyWeight: 1.000, response: {Decision: Can Proceed, Score: 0.87, Rationale: [{batteryLevel == 62}]}}
    {name: DeviceActivityPolicy, policyWeight: 5.000, response: {Decision: Can Proceed, Score: 0.20}}
 ] sumScores:52.279483, denominator:81.410000, FinalDecision: Can Proceed FinalScore: 0.642175}
default 23:18:51.806386 +0200   dasd    'com.apple.pushLaunch.com.acme.Acme:F7E7D0' has compatibility score of 1.000000 with 'com.apple.CFNetwork-cc-111-79:E7272D'. Relaxing scores.
default 23:18:51.806855 +0200   dasd    'com.apple.pushLaunch.com.acme.Acme:F7E7D0' CurrentScore: 0.642175, ThresholdScore: 0.738454 DecisionToRun:0

Похоже, что каждое тихое нажатие доставляется в iOS, но демон dasd использует несколько политик, чтобы решить, следует ли доставить тихое нажатие в приложение (например, уровень заряда батареи). Вчера вечером мне удалось получить один бесшумный толчок, но мой iPhone в это время был подключен к зарядному устройству - вероятно, оценка BatteryLevelPolicy была достаточно высокой, чтобы получить это одно тихое нажатие.

Apple не дает официальной информации об этом поведении на стороне iOS, есть только информация о троттлинге на стороне сервера:

Тихие уведомления не предназначены для того, чтобы ваше приложение работало в фоновом режиме, и они не предназначены для высокоприоритетных обновлений. APN рассматривают тихие уведомления как низкоприоритетные и могут полностью ограничить их доставку, если общее количество становится чрезмерным. Фактические ограничения являются динамическими и могут меняться в зависимости от условий, но старайтесь не отправлять более нескольких уведомлений в час.

Я держу пальцы скрещенными, они изменили это поведение, потому что это исправит мое приложение :) С другой стороны, это изменение хорошее - одно из многих, что увеличивает срок службы батареи iPhone по сравнению с телефонами Android.

person kam800    schedule 08.09.2017
comment
Да, нажатия доставляются на устройство, но не в приложение. Это то, что я написал в своем исходном посте. Тихие уведомления не предназначены для того, чтобы ваше приложение работало в фоновом режиме, это нормально, если они иногда доставляются. Большая проблема в том, что тихие уведомления никогда не доставляются в приложение в iOS 11, когда оно находится в фоновом режиме. Это полностью лишает смысла толкать данные. - person Jan; 08.09.2017
comment
Да, вы уже написали это, я просто хотел дать полное объяснение относительно этих новых политик push. Я процитировал документы Apple, чтобы показать, что они уже предупреждали о неопределенности push-доставки. Как я уже писал: вчера вечером мне удалось получить одно тихое нажатие (в приложении, которое я имел в виду), и приложение было в фоновом режиме. Но днем ​​- мое приложение не получает толчков :( На мой взгляд, Apple ослабит эти push-политики в версии RC. С другой стороны, они могут восстановить исходное поведение push - они уже использовали, чтобы избавиться от функций, представленных только в бета-версии (например, автоудаление брелка 10.3). - person kam800; 09.09.2017
comment
Я вижу похожие журналы, когда получен push и приложение приостановлено. Затем процесс dasd регистрирует default 10:17:42.994236 +0200 dasd DuetActivitySchedulerDaemon Advancing start date for <private> by 6.3 minutes to Wed Sep 13 10:24:03 2017. Кажется, что тихий толчок был доставлен в это время. - person Jan; 13.09.2017
comment
уже начал тестирование с iOS 11 GM, все еще наблюдаю странное поведение, журналы типа com.apple.fetch.com.troii.timriphone:F613DA:[ {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Must Not Proceed, Score: 0.00}} ], FinalDecision: Must Not Proceed} - person Thomas Einwaller; 13.09.2017
comment
Кроме того, при сравнении с поведением в iOS 10 я не вижу никаких журналов в iOS 10 из этого dasd DuetActivitySchedulerDaemon`, где push доставляется напрямую. - person Jan; 13.09.2017
comment
@ThomasEinwaller Я случайно вижу те же журналы и поведение. Я обновил свой исходный пост с подведением итогов - person Jan; 13.09.2017
comment
В моем сценарии тихие нажатия iOS11 не отменены полностью. Я получил пару тихих толчков, но они вроде бы отложены. - person kam800; 14.09.2017
comment
Кроме того, мне удалось решить мое приложение, отправив немой push с некоторым уведомлением о заглушках и заполнив уведомление правильным контентом с помощью расширения службы уведомлений. - person kam800; 14.09.2017

Примечания к бета-версии iOS 11.1 включают: Уведомления. Устраненные проблемы. Тихие push-уведомления обрабатываются чаще. (33278611)

person Andrew Gould    schedule 27.09.2017

iOS 11.1 Beta 2 также содержит

Notifications
Resolved Issues
• Silent push notifications are processed more frequently. (33278611)

в примечаниях к выпуску - сейчас протестирую.

ОБНОВЛЕНИЕ - 11.10.2017 - iOS 11.1 Beta 2

После использования нашего приложения в течение 2 дней в «реальных сценариях», похоже, что в этой версии iOS есть реальные улучшения. Я осторожно начинаю верить, что это исправлено.

person Thomas Einwaller    schedule 09.10.2017
comment
Я тестировал разные сценарии: он работал на переднем плане и в фоновом режиме. К сожалению, это не работает, если приложение было закрыто пользователем. После завершения работы устройство не получает никаких тихих нажатий, если пользователь снова не запускает приложение. Вы испытали то же самое? - person AlexWoe89; 10.10.2017
comment
теперь он работает ... после «простоя» ок. 5-10 минут тихие уведомления работают как положено ... извините за мою пред. комментарий :) - person AlexWoe89; 10.10.2017
comment
тихие нажатия никогда не работали, когда пользователь завершает работу приложения - см. developer.apple.com/ documentation / uikit / uiapplicationdelegate / Однако система не запускает ваше приложение автоматически, если пользователь принудительно закрывает его. - person Thomas Einwaller; 11.10.2017
comment
@ AlexWoe89, если приложение завершено (я интерпретирую это как «убитое»), ваше приложение никогда не проснется от ОС, независимо от того, является ли ваша ОС iOS 11 или 10 или 9, ваше приложение не проснется. Он проснется, если ваше приложение находится в приостановленном режиме, что означает, что оно не убито! Итак, по словам автора сообщения, бета-версия iOS 11.1 устранила эту проблему. Надеюсь, что еще не тестировал. - person AndaluZ; 13.10.2017
comment
Это довольно серьезная ошибка. Я надеюсь, что Apple скоро выпустит iOS 11.1 с исправлением. Оглядываясь назад на iOS 8, 9 и 10, версия x.1 обычно выходит примерно 20-25 октября. Я очень надеюсь, что в этом году они выпустят еще раньше, так как это ошибка, которая ломает многие приложения. - person Olecramoak; 15.10.2017
comment
Я вижу, что iOS11.1 beta 3 работает так же, как iOS10, и намного лучше, чем iOS11.1 beta 2. - person Lee; 19.10.2017
comment
Была выпущена iOS 11.1 beta 4, и, похоже, это GM (без буквы в конце номера сборки). Стабильно ли исправление на бета-версии 4? Работает ли теперь как раньше iOS 11.0? - person Olecramoak; 21.10.2017
comment
@Olecramoak для меня iOS11.1 beta 4 работает как iOS 10. - person AlexWoe89; 22.10.2017
comment
Я тестирую iOS 11.1 beta 5, и, похоже, проблема не решена. Я получаю удаленные уведомления в течение 15 минут после блокировки телефона. Если я оставлю его там, он будет находиться в «глубоком сне» и не будет получать тихих толчков, пока я не разблокирую телефон вручную. Может ли кто-нибудь воспроизвести такое поведение на 11.1b5? @ AlexWoe89 - person Olecramoak; 27.10.2017
comment
Для меня легко воспроизвести проблемы с тихим нажатием, когда приложение находится на переднем плане с бета-версией 5 - а) снизьте мощность до менее 20%, а затем они не будут доставлены (даже если устройство подключено к источнику питания) b ) если батарея составляет около 35%, и пользователь также включил режим низкого энергопотребления, они не доставляются c) изменение значений приоритета и истечения срока действия после того, как ранее были отправлены несколько нажатий с разными значениями, иногда кажется, что он не работает, пока устройство перезагружается. Это когда приложение находится на переднем плане, в фоновом режиме ситуация улучшилась. - person Gruntcakes; 27.10.2017

Apple Developer Relations только что добавили на мой радар комментарий:

Мы считаем, что эта проблема решена в последней бета-версии iOS 11.2.

Пожалуйста, проверьте последнюю бета-версию iOS. Если у вас все еще есть проблемы, пожалуйста, обновите свой отчет об ошибке любыми соответствующими журналами или информацией, которая может помочь нам в расследовании.

https://developer.apple.com/download/.

в настоящее время устанавливается бета-версия iOS 11.2 - будет протестировано поведение при тихом нажатии

person Thomas Einwaller    schedule 30.10.2017
comment
Значит ли это, что iOS 11.1 GM не решит проблему? :( - person Olecramoak; 31.10.2017
comment
Приятно слышать, когда мы действительно можем ожидать официального релиза iOS11.1? - person AlexWoe89; 31.10.2017
comment
Держите нас в курсе, в настоящее время не могу установить свое приложение, так как Xcode для 11.2 недоступен. (и я удалил приложение со своего устройства) - person Rool Paap; 31.10.2017

У меня была аналогичная проблема с моим приложением, до iOS 10 я получал push-уведомления и application:didReceiveRemoteNotification:fetchCompletionHandler вызывался правильно, но при обновлении до iOS 11 push-уведомления перестали работать.

Проблема с моим кодом заключалась в том, что, хотя я использовал content-available: 1 и mutable-content: 1 в полезных данных push-уведомлений, опция фоновой выборки не была включена. Но он отлично работал до iOS 10.

Убедитесь, что вы включили обе эти возможности.

После включения возможности фоновой выборки он работает.

person Sudeep george    schedule 20.10.2017
comment
нет, это не работает для iOS11 - просто закройте приложение один раз, и оно перестанет будить ваше приложение. просто прочтите ответы и комментарии в этой теме - person AlexWoe89; 24.10.2017
comment
Для завершенного приложения любые push-уведомления (sielent или общие push) не будут запускать метод делегата в делегате приложения. это поведение по умолчанию. Для iOS 11.0 особого случая нет. - person Sudeep george; 25.10.2017
comment
Для меня это не имеет значения. - person malhal; 23.09.2020

iOS 11.4.1, Swift 4

У меня были проблемы с беззвучными пушами, которые не поступали (из CloudKit), и я перепробовал все, что здесь упоминалось. Затем я решил попробовать установить пустой alertBody для моих CKNotificationInfo() объектов следующим образом:

let info = CKNotificationInfo()
info.shouldSendContentAvailable = true
info.alertBody = ""

Это сделало push-отправку с более высоким приоритетом (но они все еще были тихими), и я больше не получал ошибку в журналах моего устройства о том, что push-уведомления игнорировались.

Надеюсь, это кому-то поможет. :)

person Clifton Labrum    schedule 09.08.2018
comment
У меня тоже работает с CloudKit. Без alertBody вам нужно будет подключить устройство, чтобы получать удаленные уведомления. Очень странное поведение ... - person powertoold; 14.08.2018

Так что это действительно ошибка в iOS 11, и теперь она исправлена ​​в iOS 11 beta 3. application:didReceiveRemoteNotification:fetchCompletionHandler теперь вызывается правильно, когда тихое нажатие получено как на переднем плане, так и в фоновом режиме.

ОБНОВЛЕНИЕ

Нет, это не исправлено и все еще происходит в бета-версиях iOS 3 и 4

person Jan    schedule 11.07.2017
comment
На самом деле это не так :( Это все еще происходит в iOS 11 beta 3 - person Jan; 17.07.2017
comment
Да, я также получаю эту проблему в iOS 11 beta 3 - person ov1d1u; 18.07.2017
comment
Apple также повторно открыла отчет об ошибке. Я дам Вам знать - person Jan; 18.07.2017
comment
iOS 11 beta 4 отсутствует, но это все еще происходит. Можете ли вы проверить, влияет ли эта ошибка и на вас? Каков статус отчета об ошибке от Radar? - person ov1d1u; 25.07.2017
comment
Фоновые тихие нажатия также не работают для меня в iOS 11 beta 4, несмотря на то, что они работают нормально на iOS 10. Этот обратный вызов делегата даже не вызывается. - person Justin Stanley; 25.07.2017
comment
в каком состоянии находится ваше приложение, когда вы отправляете тихий толчок? - person Jan; 25.07.2017
comment
У меня все еще не работает iOS 11 beta 4, ни на переднем плане, ни на заднем плане. - person Yaman; 28.07.2017
comment
На самом деле также не для меня в бета-версии 4: / Никакие делегаты вообще не вызывались для тихих нажатий. Я также пробовал использовать UserNotifications framework, но тоже ничего не происходит - person Jan; 28.07.2017
comment
Я не получаю тихих толчков в iOS 11 beta 4. Более того, если приложение не на переднем плане, они иногда появляются как обычные уведомления. Определенно что-то вверх! - person Ben Dodson; 28.07.2017
comment
@jan Отчет об ошибке все еще открыт? Может быть, iOS 11 не поддерживает Silent Push? - person kanekin; 07.08.2017
comment
@kanekin да еще открыт. Я не могу поверить, что Apple удаляла бы тихие уведомления, не сообщая нам об этом. - person Jan; 07.08.2017
comment
Итак, я только что установил iOS 11 beta 5, и он выглядит лучше, и тихие уведомления доставляются, когда приложение находится на переднем плане или в фоновом режиме, через делегат didReceiveRemoteNotification на некоторое время, затем оно снова перестало работать, независимо от того, что я делаю: / У вас есть такое же поведение? - person Jan; 08.08.2017
comment
Я также заметил, что вскоре после перезагрузки устройства уведомления доставляются, но затем все снова перестает работать ... - person Jan; 08.08.2017
comment
@Jan Как часто вы отправляете удаленное уведомление? Я могу попробовать проверить это с тем же условием. - person kanekin; 08.08.2017
comment
Было бы здорово, если бы ты проверил, так как это вызывает у меня головную боль. Тихие нажатия работают или не работают случайным образом после перезапуска устройства. Я обновил свой исходный пост образцом проекта, чтобы мы все использовали один и тот же - person Jan; 08.08.2017
comment
@Jan Я протестировал ваш образец проекта, представленный в описании, и доставка действительно несовместима. Я добавил регистратор для записи журналов в файл, но, насколько я понимаю, нет никаких признаков доставки, пока приложение находится в фоновом режиме. Буду тестировать дальше. - person kanekin; 10.08.2017
comment
Спасибо, что дал мне знать! Я использую os_log сейчас и консоль macOS, где вы можете видеть, что push правильно доставлен на устройство, но не в приложение (я обновил свой первоначальный пост, а также образец проекта) - person Jan; 10.08.2017
comment
привет, @Jan, ваша проблема решена в последней бета-версии? - person PiyushRathi; 22.08.2017
comment
Пробовал свой собственный проект с iOS 11 beta 9, и он все еще не работает. Это дало мне следующее подозрительное сообщение об ошибке, но я действительно не знаю, связано это или нет. <Error>: Ignoring notification with no alert, sound or badge <Notice>: Not saving push notification D763-E4CF to store [ error=Error Domain=UNErrorDomain Code=1401 “Notification has no user-facing content” UserInfo={NSLocalizedDescription=Notification has no user-facing content} ] - person Azu; 01.09.2017
comment
@Azu, где вы видите это сообщение? В консоли Xcode или в консоли macOS? Включено ли удаленное уведомление в фоновых режимах в возможностях приложения? - person Jan; 01.09.2017
comment
В консоли Xcode, и да, у меня были включены удаленные уведомления на вкладке возможностей. - person Azu; 01.09.2017
comment
Если сообщение об ошибке, которое я опубликовал выше, действительно происходит при отправке тихого push-уведомления, то поведение, которое я встречал, может несколько отличаться от того, что испытал @Jan. Судя по сообщению в моем случае, похоже, что уведомление было получено, но затем отброшено ОС. - person Azu; 01.09.2017
comment
та же проблема с Beta 9 - person hariszaman; 04.09.2017
comment
похоже, что это все еще не исправлено в бета-версии 10: / Я проведу дополнительное тестирование и подтвердю, обновив исходный пост. - person Jan; 06.09.2017
comment
@Jan Та же проблема, с которой я столкнулся после обновления ОС до версии 11.4.1. Вы решили эту проблему? - person US-1234; 04.08.2018

В качестве обходного пути мы добавляем ключ «уведомления» и внутри «заголовка» с пустой строкой в ​​качестве значения. Это пробуждает обратный вызов didReceive в appDelegate.

person elkorb    schedule 08.11.2017
comment
Это, казалось, сработало для меня, а также как обходной путь, чтобы заставить DuetActivitySchedulerDaemon разрешить уведомление для пробуждения приложения, пока Apple не исправит ошибку. - person Joe Benton; 09.11.2017
comment
При отправке JSON, содержащего пустой заголовок, я все равно получаю сообщение на консоли Игнорирование уведомления без предупреждения, звука или значка ... {aps: {alert: {title:}, content-available: 1}, gcm.message_id : 0 ... bb} Эта структура JSON вам подходит? - person Olecramoak; 18.11.2017
comment
не следует ли отправлять 1 (значение для доступного содержимого) без кавычек? - person elkorb; 19.11.2017
comment
Именно так Google Firebase форматирует Json («1»), и это всегда работало. Просто iOS 11 с ерундой dasd создает проблему. Не могли бы вы опубликовать пример Json, который у вас работает? - person Olecramoak; 21.11.2017
comment
Итак, что я наблюдаю в iOS 11.1, так это то, что тихие нажатия не доставляются, если устройство работает от батареи (не заряжается), а уровень заряда батареи меньше 20%, даже если режим низкого энергопотребления НЕ активирован. Это плохо. Тихие нажатия на iOS 11 совсем ненадежны, почти бесполезны. - person Olecramoak; 21.11.2017
comment
@elkorb Разве уведомление не появляется при добавлении заголовка (даже если оно пустое)? Этот взлом заставляет его вести себя как тихое уведомление? - person Sujal; 06.07.2018
comment
мой апс выглядит так: AnyHashable (апс): {предупреждение = {название = тишина; }; доступный контент = 1; звук =; } Это не сработало как пробуждение, даже если я добавляю заголовок. - person Sujal; 06.07.2018
comment
@elkorb Протестировано добавлением ключа уведомления с пустым заголовком, но все еще не работает. Тестирую на ios 11.4 - person Sujal; 06.07.2018

На момент написания этого ответа я столкнулся с той же проблемой, что и ответ Билла Дунай.

Мое требование состояло в том, чтобы получать тихие уведомления, когда приложение находится на переднем плане, и ничего, когда приложение находится в фоновом режиме / не работает. И мой обходной путь был таким. Я не использую значки, поэтому установка нуля для меня не проблема.

{
    "aps" : {
        "badge" : 0,
        "sound" : ""
    },
    "mydata": {  
        "foo": "bar"  
    }  
}

Обратите внимание, я намеренно не использую «контент доступен». Параметр, который заставляет логику оптимизации iOS задерживать / отменять доставку уведомления.

person Rammohan Raja    schedule 29.08.2018

У меня такая же проблема с некоторыми уведомлениями (не обязательно без звука).

После просмотра всех обновлений и ответов я могу добавить два обновления, которые могут помочь:

  • Я обнаружил, что доступ к методу UIApplication.shared.isRegisteredForRemoteNotifications при получении уведомления приводит к зависанию приложения, не сообщая ничего в Xcode. Проверьте, запускаете ли вы какой-либо код после получения уведомления о доступе к методу. (isRegisteredForRemoteNotifications блокирует пользовательский интерфейс с помощью semaphore_wait_trap).

    • I discovered that I had a push notification parsing error on the console due to the "title-loc-args" : [3333] not accepting 3333 literally but accepting it as a string "title-loc-args" : ["3333"]. This made my entire interface stall after I access the method above, only on iOS 11, it works on iOS 12.
  • Я также обнаружил, что с тем же кодом он работает без проблем на iOS 12.0 (16A5366a). Но на iOS 11 это происходит.

person Rageofflames    schedule 14.09.2018

В моем случае беззвучные уведомления использовались для обновления пользовательского интерфейса после того, как работа была сделана на сайте сервера, поэтому было больно иметь нерелевантный контент в приложении. Поскольку наша полезная нагрузка для тихого уведомления содержит даже заголовок и тело, я реализую эти методы, чтобы получать рабочие уведомления в активном / неактивном приложении, без зарядки и с выключенным фоновым обновлением приложения и даже в состоянии низкого энергопотребления.

Чтобы это заработало, я добавляю делегата и создаю расширение с протоколом UNUserNotificationCenterDelegate и методом willPresent notification (iOS 10+), которое запускается каждый раз с правильной полезной нагрузкой. Чтобы не отображать уведомление, когда приложение активно, просто вызовите завершение со значком или звуком. У меня получилось что-то вроде этого

    import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    // MARK: - Lifecycle
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        UNUserNotificationCenter.current().delegate = self
        return true
    }

    //this was only method to handle notifications before
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                     fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        //process silent notification
        completionHandler(UIBackgroundFetchResult.newData)
    }
}

extension AppDelegate : UNUserNotificationCenterDelegate {
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        //proces notification when app is active with `notification.request.content.userInfo`
        if UIApplication.shared.applicationState == .active {
            completionHandler(.badge)
        }else {
            completionHandler(.alert)
        }
    }
}

И чтобы заставить работать эти состояния, когда приложение находится в фоновом режиме и тихое уведомление не вызывает мои методы, я получаю уведомления из центра уведомлений прямо в applicationDidBecomeActive по:

UNUserNotificationCenter.current().getDeliveredNotifications { (notifications) in
            debugLog(message: "unprocessed notification count: \(notifications.count)")
            if notifications.count > 0 {
                notifications.forEach({ (notification) in
                    DispatchQueue.main.async {
                        //handle `notification.request.content.userInfo`
                    }
                })
            }
        }
person Pacyjent    schedule 14.09.2018

В моем случае «Обновление приложения в фоновом режиме» было отключено в настройках iPhone. Из-за этого push-уведомление было доставлено на устройство, но не в приложение. Включение фонового обновления приложения получает в приложении тихий толчок.

Это может быть не реальный ответ на этот вопрос, на всякий случай, если кому-то нужно проверить.

person Anish    schedule 24.10.2019