Все, что вы всегда хотели знать об уведомлениях в iOS

1656606640 vse chto vy vsegda hoteli znat ob uvedomleniyah v ios

от Payal Gupta

Маленькие оповещения..?

1*KCLG3VkqwWXdgV2CXwp3Kg

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

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

С выходом в iOS-10, Apple представила совершенно новые рамки для поддержки уведомлений, будь то локальные или удаленные. Этот выпуск был сосредоточен на настроенные уведомления.

Не теряя времени, давайте просто быстро перейдем к деталям.

Типы сообщений

Мы можем широко классифицировать уведомления на две категории:

  • Локальные оповещения программа локально настраивает детали уведомлений и передает их системе. Затем система обрабатывает доставку уведомлений, когда приложение не находится на переднем плане.
  • Удаленные уведомлениявы используете один из серверов вашей компании для передачи данных на устройства пользователей через службу Apple Push Notification Service (APN).

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

Что нового в iOS-10 для уведомлений?

С выходом в iOS-10Apple представила две новые фреймворки для обработки уведомлений:

Для настройки уведомлений мы будем использовать две платформы и некоторые API для определенной платформы.

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

Apple также позволяет настроить интерфейс вашего уведомления, хотя Расширение содержимого уведомлений.

Это слишком много, чтобы запомнить? Да… наверное да. Но, не беспокойтесь. Мы увидим все шаг за шагом вместе с соответствующим кодом. Просто успокойся. ?

Прежде всего – настройте его!

Запрос авторизации

Чтобы заставить нашу программу уведомлять пользователя о чем-либо, нам нужно знать, действительно ли человек, использующий ее, этого хочет. Может, им не нравится, что их телефон звонит и постоянно отображает уведомление? или, возможно, они действительно хотят обновления, но не такой раздражительный звук… наааа!☠️

Итак, прежде всего нам нужно получить разрешение от пользователя, которого мы собираемся известить. И это довольно просто – всего две строки кода, и мы готовы:

Вам нужно написать этот код AppDelegate’s метод — application:didFinishLaunchingWithOptions:до возвращения из него.

Пожалуйста, запиши: Поскольку система сохраняет ответ пользователя, вызовы requestAuthorization(options:completionHandler:) метод во время следующих запусков не спрашивать пользователя снова.

Добавление категорий и действий — уведомления, которые можно выполнить

Структура уведомлений пользователей поддерживает добавление категорий и действий в уведомления.

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

Действия — Каждая категория может иметь до четырех действий, связанных с ней. Действия – в основном специальные кнопки, которые при нажатии закрывают интерфейс уведомлений и пересылают выбранное действие в программу для немедленной обработки.

Ладно! И что это значит..??? Некоторый код может помочь вам лучше понять:

В приведенном выше коде мы просто создали категорию с названием ПРИГЛАШЕНИЕ с четырьмя разными действиями напомнить позже, принять, снижение, и комментарий.

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

1*RAR8fwTQ_py7jtqmr7-zUw

Определите все категории и действия несколько ниже, где вы настроили оповещение application:didFinishLaunchingWithOptions: метод.

Включите идентификатор категории (например, ПРИГЛАШЕНИЕ), когда планируете уведомление локально или удаленно. Как это сделать, мы увидим в следующей главе.

Планирование локальных уведомлений

Теперь, когда мы завершили настройки уведомлений, давайте посмотрим, как на самом деле их запланировать. из программы.

Чтобы запланировать локальное оповещение, требуется всего три простых шага:

  1. Подготовьте содержание
  2. Добавьте триггер — когда уведомление должно быть запущено
  3. Запланируйте его доставку

Давайте быстро рассмотрим код, чтобы не запутаться во всем происходящем. ЛОЛ?

В приведенном выше коде вместе с другим содержимым мы также предоставили a categoryIdentifier для поддержки соответствующих уведомлений. Если мы этого не сделаем, то система примет поведение по умолчанию.

Это оно. Это все, что нужно. И да, это точно работает… хе-хе-хе.? Попытайтесь, прежде чем двигаться дальше. Вы можете скачать образец здесь.

Пожалуйста, запиши: программы поступают по-разному в фоновом и переднем планах, когда поступает уведомление.

  1. Приложение не работает / Приложение в фоновом режиме система отображает локальные сообщения непосредственно пользователю. Для этого мы не получаем обратный вызов в программе.
  2. Приложение на переднем плане система дает программе возможность внутренне обрабатывать оповещения. Система по умолчанию отключает уведомления для программ переднего плана.

Когда программа находится на переднем плане при доставке уведомления, мы получаем обратный вызов. UNUserNotificationCenterDelegate's метод — userNotificationCenter(_:willPresent:withCompletionHandler:) где вы можете решить, обрабатывать ли уведомление молча или уведомлять об этом пользователя.

Не забывайте отвечать AppDelegate к UNUserNotificationCenterDelegate протокола и установление его как делегата UNUserNotificationCenter общий объект в application:didFinishLaunchingWithOptions:.

let center = UNUserNotificationCenter.current()
center.delegate = self

Сейчас мы закончили с местными оповещениями. Давайте перейдем к тому, как мы можем запланировать уведомления за пределами нашей программы. Перед этим давайте посмотрим, как реагировать на настраиваемые действия.

Ответ на действия пользователя

Настройка уведомлений? ✔ Планируете уведомление? ✔

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

Каждый раз, когда пользователь выполняет любое действие в уведомлении, ответ посылается в UNUserNotificationCenterDelegate's метод — userNotificationCenter(_:didReceive:withCompletionHandler:)где мы можем предоставить специальную обработку каждого действия.

Пожалуйста, запиши: Если программа не работает при ответе, система запускает программу в фоновом режиме для обработки ответа.

Удаленные уведомления

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

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

Вы когда-нибудь задумывались, как им это удается? Местные оповещения ?? Это может быть… он делает то же самое, не правда ли? Может быть, мы можем сделать еще какую-то конфигурацию в самом локальном и запустить это?

Но средний, например, не имеет доступа к программе на нашем персональном устройстве, так как он может запланировать какие-либо уведомления? Точно! Это не может. Это что-то другое и нечто большее, чем просто местные.

Ладно, как насчет того, чтобы мы отправили уведомление с определенного момента и показали его в другой момент — ответит ли это на наш вопрос? Да, наверное будет. Но как это сделать? Удаленные уведомления Это.

Это именно то, что они делают. Это функция, которая решила БОЛЬШУЮ ПРОБЛЕМУ «Быть ​​в курсе».

Терминология

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

Важное примечание: Никогда не кэшируйте маркеры устройств в своей программе. Получите их из системы, когда они вам нужны.

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

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

Пожалуйста, запиши: Способность APN доставлять удаленные уведомления не запущенному приложению требует, чтобы приложение было запущено по крайней мере один раз.

Как это действительно работает

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

1*RC5Ahc9Lj2LHrTWTQ8XxVQ
  1. App регистрируется с APN
  2. APN отправляет маркер устройства в Устройство с затем посылает его в App
  3. App посылает этот маркер устройству Поставщик
  4. Поставщик посылает уведомление с маркером этого устройства APN который затем посылает его в Устройство который затем посылает его в App.

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

Обработайте это в приложении

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

Чтобы иметь возможность обрабатывать удаленные оповещения, наше приложение должно:

  1. Включить удаленные оповещения в возможностях — только один клик, и вы закончите этот шаг. В Возможности на вкладке нашего проекта Xcode, включите Push-сообщение вариант. Убедитесь, что Push-уведомление добавлено в идентификатор программы, который мы используем для проекта.
1*jxD3SJUZFNwwN6iUpNgCIA

2. Зарегистрируйтесь в службе Apple Push Notification Service (APN) и получите маркер устройства для определенного приложения

Запрос на регистрацию в APN является быстрым и простым. Просто добавьте следующий код UIApplicationDelegate’s метод- application:didFinishLaunchingWithOptions: до возвращения из него.

UIApplication.shared.registerForRemoteNotifications()

Теперь есть две возможности: либо мы успешно регистрируемся, либо процесс не удается.

После успешной регистрации APN отправляет на устройство специфический для программы маркер устройстваUIApplicationDelegate’s метод- application:didRegisterForRemoteNotificationsWithDeviceToken:.

В случае неисправности мы получаем обратный звонок UIApplicationDelegate’s метод-application:didFailToRegisterForRemoteNotificationsWithError:.

3. Отправьте маркер устройства на сервер поставщика уведомлений.

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

Поскольку у нас нет поставщика, мы можем использовать Easy APNs Provider для тестирования наших push-сообщений. Далее мы увидим, каким образом мы можем использовать этот инструмент.

Просто загрузите и установите его на свой Mac.

4. Реализуйте поддержку обработки входящих удаленных уведомлений

У нас есть токен устройства, и наш провайдер также знает о нем. Далее поставщик отправит уведомление с этим маркером и другой информацией, и мы получим его на своем устройстве.

Что теперь? Что произойдет, когда он придет? Как он будет смотреться на устройстве? Что произойдет, когда мы нажмем на него? Как насчет всех действий, которые мы настроили раньше? Можем ли мы получить их здесь?

Слишком много вопросов ❓❓❓Ну, не волнуйся. Мы получим ответы на все из них один за другим.

Что произойдет, когда он придет? Мы получим обратный звонок UIApplicationDelegate’s метод- application(_:didReceiveRemoteNotification:fetchCompletionHandler:). Он сообщает программе, что поступило удаленное уведомление, указывающее на наличие данных, которые нужно получить.

Как он будет смотреться на устройстве? Он появится с интерфейсом уведомлений по умолчанию. Если уведомление полезная нагрузка настроено с помощью категория, оно будет отображаться как уведомление, которое можно выполнить, со всеми действиями, добавленными в эту категорию. Мы обсудим полезную нагрузку в следующем разделе.

Что произойдет, когда мы нажмем на него? То же, что локальные оповещения. UNUserNotificationCenterDelegate's метод — userNotificationCenter(_:didReceive:withCompletionHandler:) вызывается с объектом ответа.

Решайте это на Провайдере

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

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

Следовательно, для отправки уведомлений от поставщика требуются следующие элементы:

  1. А маркер устройства
  2. Сертификат APNмы можем получить его из учетной записи разработчика
  3. Полезная нагрузка — любые пользовательские данные, которые вы хотите отправить своей программе, и содержащие информацию о том, как система должна известить пользователя. Это просто а JSON словарь с некоторыми парами значений ключей. Нижеследующая иллюстрация может помочь вам лучше понять это.

Давайте посмотрим, что в этом все JSON словарь:

  1. ап словарь — самый важный. Содержит Ключи, определенные Apple и используется для определения того, как система, получающая уведомление, должна известить пользователя.
  2. оповещение словарь — это скорее сам объясняющий элемент. Предоставляет содержание сообщения.
  3. категория — для действующих уведомлений. Все действия, относящиеся к данной категории, будут доступны в уведомлениях.
  4. доступное содержимое Чтобы поддерживать уведомления о фоновом обновлении, установите для этого ключа значение 1.
  5. изменяемое содержимое — Чтобы включить изменение уведомлений через Расширение программы службы уведомленийустановите значение 1.

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

Расширение программы службы уведомлений

На данный момент мы знаем что удаленные уведомления есть, как они работают, что все, что нам нужно, чтобы они работали почти все! Поскольку мы заставили их работать идеально✌️.

Теперь возникает вопрос, что делать, если мы хотим изменить содержимое в уведомлении, полученном от поставщика, перед тем, как представить его на устройстве? Что делать, если уведомление содержит ссылку на изображение, которое необходимо загрузить, прежде чем доставить его пользователю? Можем ли мы это сделать с тем, что мы знаем? У нас нет доступа к поставщику… как мы будем?

Мы действительно не можем. Мы не можем изменить то, что мы получаем, но мы точно можем изменить то, что мы представляем.

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

Добавление расширения службы уведомлений к проекту

Расширение в проекте xcode добавляется как цель. Выберите ФайлНовыйЦель Расширение службы уведомлений.

1*_p2o1WUXo-0YX_uL8iAs1A

Предпосылки

Прежде чем мы начнем изменять содержимое, существуют некоторые ограничения, когда содержимое можно изменить.

Содержание можно изменять, только если:

  • Удаленное уведомление настроено на отображение уведомления.
  • Удаленные уведомления словарь aps включает в себя изменяемое содержимое ключ со значением 1.

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

Следовательно, для поддержания любых изменений в содержании уведомлений эти условия должны быть выполнены.

Изменение содержимого

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

Он содержит два метода:

  1. didReceive(_:withContentHandler:) — внесите необходимые изменения в уведомление и сообщите систему по окончании. Этот метод имеет ограниченное количество времени (около 30 секунд) для выполнения своей задачи и выполнения заданного блока завершения.
  2. serviceExtensionTimeWillExpire() – Сообщает нам, что расширение вот-вот прекращается. Дайте нам последний шанс отправить наши изменения. Если мы не обновим содержимое уведомлений до истечения времени, система отобразит оригинальное содержимое.

Давайте рассмотрим пример. Мы изменим тело в полезная нагрузка в Фрагмент кода 7 к «Адрес: Sea Shells Apartments, Мумбаи”.

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

Расширение содержимого уведомлений

Иметь привлекательный пользовательский интерфейс всегда лучше, чем простой интерфейс по умолчанию. Добавление цветов и хороших шрифтов никогда не является плохой идеей. Мы собираемся сделать то же самое с нашими уведомлениями, чтобы они выглядели Вау!?

И и и…яблоко снова здесь, чтобы нас спасать. Расширение содержимого уведомлений Это. Это представляет пользовательский интерфейс для доставленного местный или дистанционный оповещение.

Добавление расширения содержимого уведомлений к проекту

Я думаю, мы уже знаем, как это сделать. не правда ли? Мы пойдем к тому же, что сделали для добавления Расширение службы уведомлений. Выберите ФайлНовыйЦельРасширение содержимого уведомлений.

1*5QBuMXXIn9e896Bg0Az2Iw

Добавление некоторых ключей к расширению Info.plist

Чтобы поддерживать пользовательский пользовательский интерфейс для локальных и удаленных уведомлений, нам нужно внести некоторые изменения в файл Info.plist файл расширения содержимого.

  1. UNNotificationExtensionCategory (нужно) Строка или массив строк. Каждая строчка содержит идентификатор категории, объявленной программой. Категория, надо сказать, очень важен для уведомлений. Пользовательский интерфейс пользователя отображается только для уведомлений, относящихся к указанным категориям.
  2. UNNotificationExtensionInitialContentSizeRatio (запрос.)Число с плавающей запятой, которое представляет первоначальный размер представления контроллера представления, выражено как a отношение его высоты к ширине. Это контроллер просмотра, который мы будем использовать для создания пользовательского интерфейса. Мы обсудим это в следующей главе.
  3. UNNotificationExtensionDefaultContentHidden – если правда: показывать только специальное содержимое. Если ошибочный: показывать пользовательское содержимое+по умолчанию.
  4. UNNotificationExtensionOverridesDefaultTitle – если правда: установить название уведомления на название контроллера представления. Если ошибка: для названия уведомления установлено название программы.

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

1*SiSHq4lvgJA58h4N9DToIA

На иллюстрации выше ключи в Info.plist настроены как:

  1. UNNotificationExtensionCategoryПРИГЛАШЕНИЕ
  2. UNNotificationExtensionInitialContentSizeRatio 1
  3. UNNotificationExtensionDefaultContentHiddenошибочный
  4. UNNotificationExtensionOverridesDefaultTitle ошибочный

Создание пользовательского интерфейса

Расширение содержимого уведомлений предоставляет нам a UIViewController что отвечает UNNotificationContentExtension протокол. Этот контроллер представляет интерфейс оповещения. The Storyboard файл в расширении содержит один ViewController, который мы можем использовать для создания любого пользовательского интерфейса, который мы хотим, чтобы уведомление представляло.

1*TjlQ9z2HaTKIzx-M5ISJSg

После создания пользовательского интерфейса нам нужно соединить элементы в NotificationViewController для заполнения деталей Каждый раз, когда поступает уведомление с ожидаемым категориямы получаем обратный звонок UNNotificationContentExtension’s метод — didReceive(_:) . Это место, где мы можем добавить детали в наш персонализированный интерфейс.

Мы почти завершили работу со специальным интерфейсом уведомлений. Еще 1 дело. Поскольку специальный пользовательский интерфейс добавляется в уведомления. категория, которые могут оказывать определенные действия. И… Вы правильно поняли! ?Мы получим наши действия автоматически без какой-либо специальной обработки. Гениально!

Содержимое + хороший пользовательский интерфейс + специальные действия — Все сделано. Что еще мы можем просить? Apple, ты супер!?

1*q8FG_H9ZcnMbg_SiGySsFQ

И последний момент: мы также можем добавить обработку в пользовательские действия в расширении. Система вызывает didReceive(_:completionHandler:) метод реагирования на любые избранные действия. Если наш контроллер представления не реализует этот метод, система доставляет выбранное действие вашей программе для обработки.

Если реализовано, нам необходимо обработать все возможные действия в этом методе. Здесь важно одно completion закрытие.

completion: Блок, который выполняется, когда вы закончите действие. Вы должны вызвать блок в определенный момент во время реализации. Блок не имеет возвращаемого значения.

Замыкание принимает один параметр dismiss типа UNNotificationContentExtensionResponseOption . Мы предоставляем следующие варианты:

  1. doNotDismiss — Не закрывайте интерфейс уведомлений.
  2. dismiss — Закрыть интерфейс уведомлений.
  3. dismissAndForwardAction--Закройте интерфейс уведомлений и пересылайте уведомления в программу.

Это подытоживает наши оповещения. Многовато запомнить? Практика делает прогресс ?. Попытайтесь создать собственные уведомления сейчас!

Образец проекта

Образец проекта можно скачать здесь.

И образец проекта для Расширение содержимого уведомлений можно найти здесь.

Дальнейшее чтение

Не забудьте прочитать другие мои статьи:

  1. Все о Codable в Swift 4
  2. Раскрасьте его с помощью GRADIENTS — iOS
  3. Кодирование для iOS 11: как перетаскивать в коллекции и таблицы
  4. Все, что вам нужно знать о Today Extensions (Виджет) в iOS 10
  5. Легкий выбор UICollectionViewCell..!!

Не стесняйтесь оставлять комментарии, если у вас есть вопросы.

Добавить комментарий

Ваш адрес email не будет опубликован.