Когда я читаю Apple Docs, они упоминают 3 типы уведомлений: локальное, удаленное и тихое.
Локальное уведомление можно вывести из его имени, которое приложение отправляет локально.
Однако в чем разница между двумя другими типами?
Когда я читаю Apple Docs, они упоминают 3 типы уведомлений: локальное, удаленное и тихое.
Локальное уведомление можно вывести из его имени, которое приложение отправляет локально.
Однако в чем разница между двумя другими типами?
РЕДАКТИРОВАТЬ: Хотя этот ответ полностью применим, есть некоторые дополнения (не изменения) к уведомлениям в iOS 12. Я настоятельно рекомендую посмотреть WWDC 2018: Что нового в уведомлениях пользователей и прочтите эта замечательная статья, которую необходимо прочитать.
Основные изменения:
ВАЖНОЕ ПРИМЕЧАНИЕ. Не знаю, с каких пор, но из документации Apple, "тихое уведомление" было переименовано в "фоновое уведомление".
Слишком много настроек, которые нужно настроить правильно, чтобы он работал. Я постараюсь их проанализировать и облегчить понимание.
В целом важно несколько вещей.
content-available
Я настоятельно рекомендую всем посмотреть первые 7 минут: WWDC 2015: Что нового в уведомлениях а>. Оттуда ведущий упоминает, что существует 2 основных типа уведомлений:
Они происходят в фоновом режиме, поэтому вы никогда не увидите никаких предупреждений / значков / звуков. Вещи загружаются без вашего ведома.
Ошибка iOS 11
См. здесь. В первых выпусках iOS 11 были ошибки для тихих уведомлений. Убедитесь, что у вас установлена последняя версия для тестирования, иначе она может не сработать.
Как видно из названия, это как-то связано с пользователем. То есть пользователь увидит предупреждение / значок или услышит звук. Имеет 2 вида.
Локальные уведомления
Локальное уведомление может быть запущено тремя разными способами:
UNLocationNotificationTrigger
: Вы видите предупреждение, когда находитесь рядом с магазином Walmart.
UNTimeIntervalNotificationTrigger
: например, Вы видите предупреждение каждые 10 минут.
UNCalendarNotificationTrigger
, как 1 декабря, 13:00 2017 г.
Удаленные уведомления
Они похожи на localNotifications, но запускаются с сервера, например сообщение WhatsApp с полем «От» (мама) и полем тела (я люблю тебя!).
Чтобы получать тихое или удаленное уведомление, вам необходимо зарегистрировать токен, используя:
application.registerForRemoteNotifications()
???? Регистрация НЕ требует разрешения пользователя. Благодаря этому беззвучные уведомления становятся плавными. См. этот момент видео WWDC
Беззвучные уведомления включены по умолчанию. Пользователь не должен утверждать ваши - не дает разрешения вашему приложению использовать их, и вы можете просто начать использовать их, не спрашивая разрешения у пользователя.
Помните. APN доставляются вашим пользователям через APN, а не на ваш сервер. Итак, ваш код iOS должен отправить этот токен на ваш сервер. Таким образом, сервер может связать данный токен устройства с пользователем. Когда вы хотите отправить запрос определенному пользователю, ваш сервер просто сообщает APN, что нужно отправить полезную нагрузку на конкретный токен. Важно понимать, что ваш сервер и APN - это разные вещи.
Его поток выглядит так:
Подробнее об этом см. Docs Обзор APN и Отправка запросов на уведомление APN < / а>
Чтобы иметь возможность показывать значки / предупреждения / звуки, вам необходимо запросить у пользователя разрешение:
UNUserNotificationCenter.current().requestAuthorization(options: [.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
Нужно ли мне что-то включать, чтобы получать беззвучные уведомления?
Если вы не включите это, ваше приложение не получит токен. А без токена сервер вас не узнает.
Чтобы включить backgroundModes, вы можете сделать это либо < / em> используя ваши plist или возможности Xcode.
Причина, по которой вы можете сделать это в любом случае, заключается в том, что: plist ближе к вашему коду и является старым способом, возможно, он существует для поддержки устаревших версий. Возможности Xcode - это более новый и простой способ.
plist:
Элемент 0 - это просто индекс, это не ключ словаря (то, что вы обычно видите в plist), UIBackgroundModes - это array
строк. Строки должны происходить только от принятого значения из UIBackgroundModes Array.
Возможности Xcode:
Проверьте Remote Notification
в Xcode в фоновых режимах, как показано ниже:
Если вы не сделаете ничего из вышеперечисленного, отключите уведомления с помощью:
убьет удаленные и локальные уведомления
Однако, если вы действительно включите фоновое обновление приложения с помощью возможностей plist или Xcode, то даже при отключенных для приложения уведомлениях вы все равно будете получать тихие уведомления!
Если пользователь хочет отключить тихие уведомления, ему придется отключить оба уведомления и отключить «фоновое обновление приложения» для вашего приложения / во всей системе. Чтобы отключить «обновление фонового приложения» в вашей системе, вам необходимо сделать следующее:
Зачем я все это говорю? Чтобы объяснить вам, что настройки тихих и push-уведомлений различаются для пользователя и ограничения на их отправку различны. Для получения дополнительной информации см. этот момент с WWDC. видео. См. здесь (предыдущая ссылка была мертва):
Беззвучные уведомления включены по умолчанию.
Пользователь не должен утверждать, что вы не разрешаете вашему приложению использовать их, и вы можете просто начать использовать их, не спрашивая разрешения у пользователя.
Но автоматические уведомления - это механизм фонового обновления приложения.
В любой момент вы знаете, что пользователь может зайти в настройки и отключить их.
Таким образом, вы не можете рассчитывать на их постоянную доступность.
Вы не знаете, отключил ли их пользователь, и вы больше не получаете уведомления.
Это также означает, что автоматические уведомления доставляются с максимальной эффективностью.
Это означает, что когда уведомление поступает на устройство пользователя, система будет делать некоторые варианты выбора.
Он будет использовать разные сигналы от устройства и поведения пользователя, такие как мощность или время суток, чтобы решить, когда пора доставить уведомление и запустить приложение.
Он может попытаться сэкономить заряд батареи или попытаться соответствовать поведению пользователя и сделать контент доступным, когда пользователь с большей вероятностью будет его использовать.
Также см. здесь.
ПРЕДОСТЕРЕЖЕНИЕ: даже если вы отключите фоновое обновление приложения и отключите разрешающие уведомления, вы все равно сможете получать беззвучные уведомления, если ваше приложение находится в FOREGROUND. Если ваше приложение работает в фоновом режиме, они не будут доставлены.
Нужно ли мне что-то включать для получения удаленных уведомлений?
Вам просто нужно включить Push-уведомления в ваших возможностях Xcode:
Если вы не включите это, ваше приложение не получит токен. А без токена сервер вас не узнает.
Любопытно ... Можете ли вы сказать мне, как должны выглядеть мои полезные данные?
Я настоятельно рекомендую вам ознакомиться с Apple § документация. Это очень понятно, И СМОТРИТЕ ТАКЖЕ Отправка запросов на уведомления в APN. В основном платформа выполняет HTTP / 2-вызов APN и отправляет желаемую полезную нагрузку. Отправка правильных заголовков имеет решающее значение, иначе ваши уведомления не будут доставлены на устройства!
Спасибо, но не могли бы вы рассказать мне самые важные детали?
ммм ... Хорошо, но вы знаете, что это из ссылки, которую я только что сказал:
Для тихих уведомлений существует единственный критерий:
aps
полезной нагрузки должен включать ключ content-available
со значением 1
.Если есть видимые для пользователя обновления, которые идут вместе с фоновым обновлением, вы можете установить ключи предупреждений, звука или значка в словаре APS, в зависимости от ситуации.
Пример полезной нагрузки будет выглядеть так:
{
"aps" : {
"content-available" : 1
},
"acme1" : "bar",
"acme2" : 42
}
acme1, acme2 или просто некоторые пользовательские данные! Но для ключа aps
вы ДОЛЖНЫ следовать структуре Apple, иначе он не будет отображать правильно, и вы не сможете правильно читать данные.
Примечание. Я не проверял это, но другой инженер упомянул, что если у вас включены предварительные уведомления, то для обеспечения доставки тихих уведомлений вы должны включить поле предупреждения с пустым телом. Например:
{
"aps" : {
"content-available" : 1,
"alert" : {
"body" : "",
},
},
}
Для уведомлений пользователей:
Вам нужен 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, чтобы он знал, что нужно проснуться и что-то загрузить. В противном случае он просто всплывет и предупредит / значок / звук, но ничего не загрузит.
ВАЖНЫЕ ЗАМЕТКИ:
content-available
на 1
для каждой полезной нагрузки.content-available
делать нечего.content-available
на 1
.(ТРЕТИЙ ВАРИАНТ)
{
"aps" : {
"content-available" : 1
"alert" : "You got your emails.",
"badge" : 9,
"sound" : "bingbong.aiff"
},
"acme1" : "bar",
"acme2" : 42
}
Этот момент из видео WWDC упоминает ???? sub>
Цитата инженера Apple:
Теперь вы можете в удаленном уведомлении пользователя установить тот же флаг доступный контент, который вы установили в автоматических уведомлениях, и это дает вашему приложению некоторое время для загрузки. контент или обновите контент, который он хочет отображать, чтобы, когда пользователь нажимает на уведомление, ваш контент был доступен. И пользователь видит, что он делает. Это способ иметь тихое уведомление внутри уведомлений пользователя, таких как сводка.
Я не понимаю, что такое удаленные уведомления. Я думал, что всякий раз, когда я получаю уведомление, мое приложение становится активным в фоновом режиме и что-то загружает. Вы можете объяснить?
например в данный момент:
Ваш iPhone только что получил удаленное уведомление без отправителя. Чтобы получить это, WhatsApp не должен работать в фоновом режиме, то есть вам не нужно включать удаленные уведомления из BackgroundModes. Вы все равно получите уведомление, даже если ваше приложение было принудительно закрыто или приостановлено, потому что процессом управляет ОС, а не приложение WhatsApp. Однако, если вы хотите иметь возможность загружать фактическое сообщение или его изображение / видео в WhatsApp (чтобы после того, как ваш пользователь откроет WhatsApp, видео будет сидеть там, ожидая пользователя), тогда вам нужно, чтобы ваше приложение стало активным. . Для этого вам нужно content-available : 1
и реализовать application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
.
Точно так же, если вы отключили сотовые данные для приложения, вы все равно будете получать его уведомления. Однако, нажав на это уведомление, пользователь не сможет отправлять какие-либо сетевые запросы для этого приложения. Они смогут только открыть приложение.
Или, что касается другого аналогичного сценария, если сервер / точка доступа, к которой вы подключены, имеет ограниченный доступ, скажем, для WhatsApp, он все равно позволит вам получать уведомления APN. Однако, нажав на это уведомление, пользователь не сможет отправлять какие-либо сетевые запросы для этого приложения. Они смогут только открыть приложение.
ПРЕДОСТЕРЕЖЕНИЕ: если приложение было принудительно закрыто пользователем, то, хотя вы и получили уведомление по вышеупомянутым причинам, вы не можете ничего сделать, чтобы автоматически вывести приложение из завершенного состояния. (даже если для content-available
установлено значение 1
). Ни один из ваших методов делегата не будет задействован. Пользователь должен открыть приложение, и только тогда будут доступны методы вашего делегата.
Хотя уведомления широко используются для доставки фактического содержимого в приложение, они в некоторой степени НЕ предназначены для доставки содержимого в приложение. Скорее, они предназначены для уведомления пользователя о том, что пришло что-то новое (сообщение размером 2b или маленькое изображение размером 50kb, или изображение 10mb или видео 2gb). Откройте приложение, если хотите. Кстати, вот небольшой фрагмент (само сообщение если оно может поместиться, заголовок изображения или миниатюра, показанная в уведомлении, заголовок видео или миниатюра, показанная в видео. Для получения дополнительной информации см. резервный вариант APN для iOS. Повторюсь, вы никогда не загружаете вложение размером 40 МБ отправлено в электронном письме. Вы просто получаете уведомление о его существовании. Вы отправляете достаточно (эскиз вложения), чтобы пользователь был проинформирован о том, что нового, и мог решить, нужно ли ему открывать приложение для большего количества. Когда Я был новичком в iOS и думал, что вы действительно отправляете изображение / видео через push-уведомление.
В частности, в случае беззвучных уведомлений:
Когда устройство получает фоновое уведомление, система может задерживать и задерживать доставку уведомления, что может иметь следующие побочные эффекты:
Когда система получает новое фоновое уведомление, она отбрасывает старое уведомление и сохраняет только самое новое.
Если что-то принудительно завершает или убивает приложение, система отбрасывает задержанное уведомление.
Если пользователь запускает приложение, система немедленно отправляет задержанное уведомление. Отправка фоновых обновлений в ваше приложение docs
APN отправляет ограниченное количество тихих уведомлений - уведомлений с ключом доступного содержимого - в день. Кроме того, если устройство уже превысило свой дневной бюджет мощности, тихие уведомления не отправляются снова, пока не будет сброшен бюджет мощности, что происходит один раз в день. Эти ограничения отключены при тестировании вашего приложения из Xcode. См. Раздел «Размещение фоновых обновлений в вашем приложении».
Советы по устранению неполадок при обработке ошибок, возвращаемых ANP
Даже для уведомлений удаленного пользователя пользователь может быть отключен от Интернета, и это может привести к просроченному контенту или APN могут задушить вас, если вы отправляете уведомления слишком много или слишком быстро. Смотрите здесь снова
Короче говоря, APN и ОС - король, и вы ниже этого. Следовательно, вы не можете полагаться на его выполнение каждой вашей команды. При этом он очень надежен в том смысле, что вы видите, что большинство приложений для обмена сообщениями успешно его используют.
.p12
или .pem
и как все это проверить?Просто посмотрите этот потрясающий ответ. На нем больше всего скриншотов, которые я когда-либо видел.
content-available
, я считаю, что это content_available
. Дополнительную информацию см. здесь
- person Honey; 30.11.2017
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
У меня есть одно сомнение, когда мое приложение находится на переднем плане, этот метод вызывается без нажатия на него, поэтому, если мне нужно открывать экран только по касанию, это запускает эту функцию. Как запустить функцию, когда приложение находится на переднем плане, пользователь получает уведомление и нажимает на него.
- person Sharad Chauhan; 06.08.2020
Push-уведомление позволит пользователю узнать, что он получил уведомление (например, с отображением всплывающего окна с уведомлением). Беззвучное уведомление обновится, но пользователь не получит уведомления об этом. В любом случае вы можете выполнять действия при уведомлении в беззвучном режиме, как если бы это было push-уведомление. Единственное отличие состоит в том, что пользователь не получит уведомление во всплывающем уведомлении.
С автоматическим уведомлением:
Разница в полезной нагрузке:
Отправить уведомление:
aps {
content-available: 1
alert: {...}
}
Беззвучное уведомление:
aps {
content-available: 0
alert: {...}
}
И вы должны установить в Возможности выбранный вами фоновый режим.
content-available
= 1, хотя
- person transang; 16.02.2017
content-available
в 1
, а затем одновременно получать оповещения. См. «Третий вариант» из моего ответа здесь. (Этот ответ на 100% неверен и сбивает с толку)
- person Honey; 13.09.2017
Тихое push-уведомление достигает устройства, пользователь ничего не знает об уведомлении, но его приложение получает уведомление, и приложению будет предоставлено некоторое время для загрузки нового контента и его представления пользователю, независимо от состояния приложения (т.е. запущено или нет. Бег)
Метод удаленного push-уведомления вызывается только тогда, когда ваше приложение запущено. Если приложение приостановлено или не запущено, система просыпается или запускает ваше приложение и переводит его в фоновое состояние перед вызовом метода. Этот метод предназначен для отображения обновленного содержимого для пользователя. Когда этот метод вызывается, ваше приложение имеет до 30 секунд времени настенных часов для выполнения операции загрузки и вызова указанного блока обработчика завершения. Если обработчик не будет вызван вовремя, ваше приложение будет приостановлено.
Для получения дополнительной технической информации вы можете перейти по этим ссылкам: