IOS push-уведомление с убитым приложением - быстрое

Я разрабатываю чат iOS с push-уведомлениями, и я использую Firebase Cloud Messaging, но у меня есть эта проблема:

Когда приложение убито (не в фоновом режиме), есть способ получить обратный вызов из уведомления, чтобы получить контент (сообщение чата)?

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

Документация Firebase не очень понятна в этом аргументе. Только если я отправляю молчаливое уведомление (без поля "уведомление" ), когда я открываю приложение, вызывался обратный вызов приложения didReceiveRemoteNotification, но я могу получить только последнее уведомление. Этот обратный вызов не вызывается в фоновом режиме

ОБНОВЛЕНИЕ 02/12/2016:

После многих тестов я связался с поддержкой Apple, и они ответили мне на это письмо:

Я отвечаю на ваш вопрос о оповещениях о фоновых тонах.

Эта тема была впервые обсуждена на сессии WWDC 2013 г. 204 WWDC 2013: Что нового в многозадачности. Тихие push-уведомления (те, чьи полезная нагрузка содержит только ключ, доступный для контента, и отсутствие предупреждений, значков, или звуковые клавиши) дросселируются для доставки только тогда, когда iOS определяет что его энергоэффективность для этого.

Push-уведомления с помощью видимых пользователем клавиш, таких как предупреждение, звук или Значок, отправленный с высоким приоритетом (приоритет 10), всегда отображается. Однако, если уведомление также содержит ключ, доступный для контента, уведомление может быть дросселировано и, таким образом, не будет отправлено в приложение в фон, если пользователь не удаляет уведомление.

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

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

Цель дросселя - предсказать, когда пользователь запустит приложения и, таким образом, позволяют фоновой активности обновлять содержимое приложений в энергосберегающим способом. Он также служит для предотвращения приложений из потребляя слишком много батареи пользователя или сотовых данных с помощью фоновый трафик.

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

Поскольку эти бюджеты применяются во всех приложениях на устройстве, его возможный что приложение, отличное от вашего, исчерпало бюджеты. Ты можешь проверьте общее использование батареи в приложении "Настройки" > "Основные" > Использование > Использование батареи.

Дроссель также отслеживает, когда устройство имеет плохую сеть подключения, поскольку повторяющиеся попытки подключения к APN, когда сетевое соединение является пятнистым, что может привести к значительным утечкам энергии. Эта на сегодняшний день является наиболее распространенной причиной того, почему push-уведомления не достигают устройство. Чтобы проверить, влияет ли плохое сетевое подключение на ваш push уведомлений, вы можете использовать шаги в разделе "Наблюдение за состоянием" Сообщения.

Дроссель отключен, если вы запустили приложение с прикрепленным отладчиком. Это позволяет проверить, что ваши уведомления получены правильно, но следует рассматривать только как наилучший вариант.

Кроме того, начиная с iOS 9, пользователи имеют возможность дроссель в любое удобное для вас время, включив режим низкой мощности в Настройки > Аккумулятор.

Чтобы протестировать уведомления о фоновых тонах, выполните следующие действия.

  • Прикрепите устройство к компьютеру Mac.
  • Запустите приложение с Xcode.
  • Когда он запустится, остановите приложение из Xcode, нажав кнопку "Стоп" (квадратный значок в верхнем левом углу).
  • В Xcode do Debug → Attach to Process → [Заполнить имя процесса для ожидания] → Прикрепить
  • Отправьте push-уведомление с доступным контентом: 1, и ваше приложение будет получать уведомление каждый раз.

Вы можете использовать список процессов в Инструментах, чтобы подтвердить, что ваше приложение работает в фоновом режиме.

Вы также можете протестировать с помощью Wi-Fi и устройства, подключенного к стене мощность.

Если вы отправляете тихие push-уведомления, убедитесь, что вы используете API поставщика APN или API бинарных провайдеров, чтобы вы могли установить приоритет уведомления 5. (По умолчанию приоритет равен 10.)

Если вы считаете, что дросселирование не работает должным образом, напишите ошибку отчет https://developer.apple.com/bug-reporting. Детали как работают дросселирование, это не открытый API, но iOS Engineering рассматривает эти отчеты об ошибках и могут определять, являются ли уведомления дросселированный, как ожидалось.

Важным моментом является то, что приложения никогда не должны планироваться что каждое push-уведомление будет получено. Это не то, как APN предназначенный для работы; он предназначен для информирования пользователя или приложения о том, что некоторые событие интереса. Ожидается, что приложения будут работать правильно, хотя, возможно, с ухудшенной функциональностью, если push-уведомления не получено. Пользователь может отключить push-уведомления или фон обновления приложений в любое время, и, конечно, push-уведомления не будут если устройство не имеет подключения к Интернету.

Начиная с iOS 7, все категории фона, кроме местоположения и VoIP (на iOS 9.3 и новее) ведет себя последовательно, когда пользователь принудительно закрывает приложение из многозадачного дисплея. Приложение не будет запускается автоматически автоматически, пока пользователь не захочет его запускать еще раз. Это означает, что пользователь не намерен запускать приложение, который может быть очень важным методом восстановления, если приложение запутывание и сбой при запуске.

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

После этого письма я попытался отправить уведомление с убитой Telegram. Телеграмма получает push-уведомление и показывает его, но если я открою приложение после установки автономного режима, сообщение не будет отображаться в чате (это означает, что, конечно, телеграммный сервер контактов проверяет непрочитанное сообщение, когда я его открываю)! Вместо этого whatsapp может добавлять сообщение в фоновом режиме, потому что это приложение VoIP, и оно может вызывать фоновый обратный вызов.

Таким образом, единственный способ добавить сообщение - связаться с сервером и получить непрочитанное сообщение.

В android есть такая же проблема, но, вероятно, вы можете решить ее с помощью фоновой службы (и перезапустить ее, когда она будет убита).

Теперь мне нужно выбрать, использовать ли уведомления Apple Push или оповещения о нажатии кнопки FCM. Надежность такая же? (Поскольку, например, Telegram в android использует как служебную услугу push, так и FCM, потому что они говорят, что FCM не очень надежна)

Ответ 1

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