В чем разница между удаленным уведомлением и тихим уведомлением в iOS?
Когда я читаю Apple Docs, они упоминают 3 типа уведомлений: локальное, удаленное и беззвучное.
Локальное уведомление может быть выведено из его имени, которое отправляется приложением локально.
Однако чем отличаются 2 других типа?
Большое спасибо.
3 ответа
РЕДАКТИРОВАТЬ: Хотя этот ответ полностью применим, есть некоторые дополнения (не изменения) к уведомлениям в iOS12. Я настоятельно рекомендую посмотреть WWDC 2018: что нового в уведомлениях пользователей и посмотреть здесь
Основные изменения:
- групповые уведомления
- предварительные уведомления
- критические уведомления
- возможность взаимодействия с уведомлениями в расширениях
Есть слишком много настроек, которые должны быть установлены правильно, чтобы он работал. Я постараюсь разобрать их и сделать так, чтобы их было легче понять.
В целом несколько вещей важны.
- общая разница между тихим и пользовательским уведомлением
- различные типы пользовательских уведомлений
- как удаленное уведомление, т. е. полезная нагрузка настраивается с вашего сервера
- как включить push-уведомления и удаленные уведомления из фоновых режимов вашего проекта
- как зарегистрировать свой токен для удаленных и тихих уведомлений
- как запросить разрешение на уведомления пользователя
- включение "фонового обновления приложения" и "уведомлений" с устройства
- что такое
content-available
- понимание того, что iOS является апстримом для вашего приложения, когда дело доходит до получения удаленного уведомления
- что происходит, когда ОС получает уведомления, когда приложение было закрыто пользователем.
- Замечание о надежности и архитектуре APN
Я настоятельно рекомендую всем посмотреть первые 7 минут: WWDC 2015: что нового в уведомлениях. Оттуда ведущий упоминает, что существует 2 основных типа уведомлений:
Тихие уведомления
Они происходят на заднем плане, поэтому вы никогда не увидите никаких предупреждений / значков / звуков. Вещи загружаются без вашего ведома.
iOS11 ошибка
Смотрите здесь. Первые версии iOS 11 содержали ошибки для тихих уведомлений. Убедитесь, что у вас установлена последняя версия для тестирования, иначе она может не работать
Пользовательские уведомления
Как следует из названия, это как-то связано с пользователем. То есть пользователь увидит предупреждение / значок или услышит звук. Имеет 2 типа.
Локальные уведомления
Локальное уведомление может быть запущено 3 различными способами:
UNLocationNotificationTrigger
: Вы видите предупреждение, когда находитесь рядом с магазином Walmart.UNTimeIntervalNotificationTrigger
Например, вы видите предупреждение каждые 10 минут.UNCalendarNotificationTrigger
как 1 декабря 13:00 2017.
Удаленные уведомления
Они похожи на localNotifications, но они запускаются с сервера, например, сообщение WhatsApp, которое имеет поле From (мама) и поле тела (я люблю тебя!).
Несколько случайных заметок:
Чтобы получать молчаливое или удаленное уведомление, необходимо зарегистрироваться на токене, используя:
application.registerForRemoteNotifications()
Регистрация НЕ требует разрешения пользователя. Это делает молчаливые уведомления, чтобы стать безразличным. Смотрите этот момент видео WWDC
Тихие уведомления включены по умолчанию. Пользователю не нужно одобрять ваше - не дает разрешения вашему приложению использовать их, и вы можете просто начать использовать их, не спрашивая у пользователя разрешения.
Чтобы иметь возможность показывать значки / оповещения / звуки, вам необходимо запросить разрешение у пользователя:
UNUserNotificationCenter.current().requestAuthorization([.alert, .badge, .sound]) { (granted, error) in
guard error == nil else {
//Display Error.. Handle Error.. etc..
return
}
if granted {
//Do stuff here..
//Register for RemoteNotifications. Your Remote Notifications can display alerts now :)
application.registerForRemoteNotifications()
}
else {
//Handle user denying permissions..
}
}
Вопрос: Нужно ли запрашивать доступ один раз для локальных уведомлений и один раз для удаленных уведомлений?
Нет. Просто напишите приведенный выше фрагмент, и он запросит доступ как для удаленного, так и для локального
Теперь давайте перейдем к хитрой части:D
Нужно ли мне что-то включать, чтобы получать уведомления Silent?
если вы не включите это, ваше приложение не получит токен. И без токена сервер не узнает вас
- Чтобы иметь возможность загружать вещи из фона, необходимо включить: удаленные уведомления из фоновых режимов.
Чтобы включить backgroundModes, вы можете сделать это, используя ваши возможности plist или Xcode.
Причина, по которой вы можете сделать это, также заключается в том, что plist ближе к вашему коду и является старым способом, возможно, он существует для поддержки прежних версий. Возможности XCode - это новый простой способ
PLIST:
элемент 0 - это просто индекс, он не является ключом словаря (то, что вы обычно видите в plist), UIBackgroundModes - это array
строк. Строки должны исходить только из принятого значения из массива UIBackgroundModes
Возможности Xcode:
Проверить Remote Notification
в Xcode в фоновых режимах, как показано ниже:
Если вы не делаете ничего из вышеперечисленного, то отключите уведомления с помощью:
убьет удаленные и локальные уведомления
Однако если вы включите фоновое обновление приложения из plist или Xcode Capabilities, то даже при отключенных уведомлениях для приложения вы все равно будете получать уведомления без вывода сообщений!
Если пользователь хочет отключить уведомления без вывода сообщений, ему придется отключить оба уведомления и отключить "фоновое обновление приложения" для вашего приложения / для всей системы. Чтобы отключить "фоновое обновление приложения" для всей системы, вы должны сделать следующее:
Почему я все это говорю? Чтобы объяснить вам, что настройки Silent & Push-уведомлений различны для пользователя и ограничения для их отправки различны. Для получения дополнительной информации смотрите этот момент из видео WWDC. Смотрите здесь вместо (предыдущая ссылка была мертвой):
Тихие уведомления включены по умолчанию.
Пользователь не должен утверждать, что вы не разрешаете вашему приложению использовать их, и вы можете просто начать использовать их, не спрашивая у пользователя разрешения.
Но тихие уведомления являются механизмом фонового обновления приложения.
В любой момент вы знаете, что пользователь может зайти в настройки и отключить их.
Таким образом, вы не можете зависеть от того, чтобы они всегда были доступны.
Вы не знаете, выключил ли пользователь их, и вы больше не получаете уведомление.
Это также означает, что тихие уведомления доставляются с максимальной отдачей.
Это означает, что когда уведомление поступит на устройство пользователя, система собирается сделать некоторые выборы.
Он будет использовать различные сигналы от устройства и от поведения пользователя, такие как мощность или время суток, чтобы определить, когда самое подходящее время для доставки уведомления и запуска вашего приложения.
Он может попытаться сэкономить батарею или попытаться соответствовать поведению пользователя и сделать контент доступным, когда пользователь с большей вероятностью будет его использовать.
Также смотрите здесь
ПРЕДУПРЕЖДЕНИЕ. Даже если вы отключите фоновое обновление приложения и отключите разрешения на уведомления, вы все равно сможете получать уведомления без вывода сообщений, если ваше приложение находится в ЗАГЛУШЕНИИ. Если ваше приложение работает в фоновом режиме, оно не будет доставлено.
Нужно ли что-то включать для получения удаленных уведомлений?
Вам просто нужно включить Push-уведомления из ваших возможностей XCode:
если вы не включите это, ваше приложение не получит токен. И без токена сервер не узнает вас
Любопытно... Можете ли вы сказать мне, как должен выглядеть мой груз?
Я настоятельно рекомендую вам ознакомиться с документацией Apple §. Это очень ясно.
Спасибо, но вы можете просто сказать мне важные части?
хм... хорошо, но только чтобы вы знали, что это по ссылке, которую я только что сказал:
Для Silent Notification есть два критерия:
- Полезная нагрузка
aps
словарь должен включатьcontent-available
ключ со значением1
, - Полезная нагрузка
aps
словарь не должен содержатьalert
,sound
, или жеbadge
ключи.
Пример полезной нагрузки будет выглядеть так:
{
"aps" : {
"content-available" : 1
},
"acme1" : "bar",
"acme2" : 42
}
acme1, acme2 или просто некоторые пользовательские данные! Но для aps
ключ, вы ДОЛЖНЫ следовать структуре Apple, иначе она не будет правильно отображаться, и вы не сможете правильно читать данные.
Для удаленных уведомлений:
тебе нужен alert
ключ внутри вашего aps
В качестве примера:
{
"aps" : {
"alert" : "You got your emails.",
"badge" : 9,
"sound" : "bingbong.aiff"
},
"acme1" : "bar",
"acme2" : 42
}
Существует также третий вариант, который я буду обсуждать ниже.
Как узнать какие фиксированные aps
& alert
ключи словаря видят эти документы Apple
Хорошо понял. Что такое content-available
?
Очень просто. Это просто флаг, который говорит вашему приложению, что вам нужно проснуться и загрузить что-то, потому что у меня есть контент, доступный для загрузки! Для получения дополнительной информации посмотрите этот точный момент
По умолчанию content-available
флаг не включен, т.е. по умолчанию отправленные вами уведомления не будут срабатывать application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
или сделать что-то в вашем приложении. Было бы просто показать уведомление. Если вы хотите разбудить приложение (сделать что-то в фоновом режиме), то вам нужно включить content-available
и установите его 1
,
§: Если вы используете Firebase, то структура полезных данных и ключи могут немного отличаться. Например ключ
content-available
заменяетсяcontent_available
, Для получения дополнительной информации см. Документацию Firebase, а также здесь
Я знаю, что вы сказали мне, что я могу загружать что-то в свое приложение только тогда, когда использую тихие уведомления, но есть ли способ, чтобы я также мог разбудить свое приложение в фоновом режиме И загрузить что-то для удаленных уведомлений?
Да, но тогда, как и в случае с тихим уведомлением, вы также должны content-available
Отметьте 1, чтобы он проснулся и загрузил что-нибудь. В противном случае он просто выскочит и выдаст предупреждение / значок / звук, но ничего не загрузит.
ВАЖНАЯ ЗАМЕТКА:
- Если ваше приложение имеет только тихие уведомления, то просто включите "push-уведомления" + "удаленные уведомления" из возможностей и установите
content-available
в1
для каждой полезной нагрузки. - Если ваше приложение имеет только удаленные уведомления, просто включите возможности формы "Push-уведомления"... Ничего не поделаешь
content-available
, - Однако, если вы хотите, чтобы ваши уведомления вызывали показ оповещения / значка / звука, а также загружали что-то в фоновом режиме, вы должны включить "удаленные уведомления" и "Push-уведомления" + установить
content-available
в1
,
(ТРЕТИЙ ВАРИАНТ)
{
"aps" : {
"content-available" : 1
"alert" : "You got your emails.",
"badge" : 9,
"sound" : "bingbong.aiff"
},
"acme1" : "bar",
"acme2" : 42
}
этот момент из видео WWDC упоминает
Я запутался в удаленных уведомлениях... Я думал, что когда получаю уведомление... мое приложение становится активным в фоновом режиме и загружает что-то... Вы можете объяснить?
например, в данный момент:
Ваш iPhone только что получил удаленное уведомление с телом "нет отправителя". Чтобы получить это...WhatsApp не должен работать в фоновом режиме, т.е. вам не нужно включать "Удаленные уведомления" из BackgroundModes. Вы все равно получите уведомление, даже если ваше приложение было принудительно завершено или приостановлено. Потому что процесс управляется ОС, а не приложением WhatsApp. Однако, если вы хотите иметь возможность загружать само сообщение или его изображение / видео в WhatsApp (так что, как только ваши пользователи откроют WhatsApp, видео будет сидеть там в ожидании пользователя), вам нужно, чтобы ваше приложение стало активным. Для этого вам нужно
content-available : 1
и реализоватьapplication(_:didReceiveRemoteNotification:fetchCompletionHandler:)
,Точно так же, если вы отключили сотовые данные для приложения, вы все равно будете получать их уведомления. Однако, нажав на это уведомление, пользователь не сможет делать какие-либо сетевые запросы для этого приложения. Они смогут только открыть приложение.
Или, что касается другого подобного сценария, если сервер / точка доступа, к которой вы подключены, имеет ограниченный доступ, например, к WhatsApp, он все же позволит вам получать уведомления APN. Однако, нажав на это уведомление, пользователь не сможет делать какие-либо сетевые запросы для этого приложения. Они смогут только открыть приложение
ПРЕДУПРЕЖДЕНИЕ. Если приложение было принудительно завершено пользователем, то, хотя вы и получаете уведомление по вышеупомянутым причинам, вы ничего не можете сделать, чтобы автоматически вывести приложение из завершенного состояния (даже если у вас было content-available
установлен в 1
). Ни один из ваших методов делегата не будет сбит. Пользователь должен открыть приложение, и только после этого будут доступны ваши методы делегирования.
Замечание о надежности и архитектуре APN: уведомления НЕ предназначены для доставки контента в приложение. Скорее, они предназначены для информирования пользователя о том, что "эй, что-то новое появилось (сообщение 2b или маленькое изображение 50 КБ, или изображение 10 МБ или видео 2 ГБ)... откройте приложение, если хотите... кстати, вот маленький кусочек (собственно само сообщение, если оно может уместиться, заголовок изображения или миниатюра, показанная в уведомлении, заголовок видео или миниатюра, показанная в видео ". Подробнее см. iOS APNS" best-Усилие " ". Повторюсь, вы никогда не скачиваете вложенное 40-мегабайтное вложение, отправленное по электронной почте. Вы просто получаете уведомление о его существовании. Вы отправляете достаточно (просто миниатюрное представление вложения), чтобы пользователь был проинформирован о том, что нового и может решить, нужно ли им открывать приложение для большего. Когда я был новичком в iOS, я думал, что вы на самом деле отправляете изображение / видео через push-уведомление.
Push-уведомление позволит пользователю узнать, что он получил уведомление (например, показ всплывающего уведомления). Автоматическое уведомление будет обновлено, но пользователь не получит уведомление об этом. В любом случае вы можете выполнять действия при уведомлении в режиме без вывода сообщений, как если бы это было push-уведомление. Единственная разница в том, что пользователь не получит уведомление с помощью всплывающего уведомления.
Разница в полезной нагрузке:
Отправить уведомление:
aps {
content-available: 1
alert: {...}
}
Тихое уведомление:
aps {
content-available: 0
alert: {...}
}
И вы должны установить в Capabilities режим фона, который вы выберете.
Тихое push-уведомление достигает устройства, пользователь ничего не знает об уведомлении, но его приложение получает уведомление, и приложению будет предоставлено некоторое время для загрузки нового контента и представления его пользователю, независимо от состояния приложения (т.е. запущено или нет). Бег)
Метод удаленного push-уведомления вызывается только во время работы приложения. Если приложение приостановлено или не запущено, то система активирует или запускает ваше приложение и переводит его в фоновое рабочее состояние перед вызовом метода. Этот метод предназначен для показа обновленного содержимого пользователю. Когда этот метод вызывается, ваше приложение имеет до 30 секунд времени настенного времени для выполнения операции загрузки и вызова указанного блока обработчика завершения. Если обработчик не вызывается вовремя, ваше приложение будет приостановлено.
Для получения более подробной технической информации вы можете перейти по этим ссылкам: