Все, що ви завжди хотіли знати про сповіщення в iOS

Досить маленькі сповіщення ..?

Сповіщення - це спосіб інформувати користувачів, коли нові дані стають доступними для їх програм, навіть коли програма не працює на передньому плані.

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

З виходом iOS-10 Apple представила абсолютно нові фреймворки для підтримки повідомлень, будь то локальні або віддалені.Цей випуск був зосереджений на індивідуальних сповіщеннях .

Не витрачаючи часу, давайте просто швидко перейдемо до деталей.

Види повідомлень

Ми можемо широко класифікувати сповіщення на дві категорії:

  • Локальні сповіщення - програма налаштовує деталі сповіщень локально та передає ці деталі системі. Потім система обробляє доставку сповіщення, коли програма не на першому плані.
  • Віддалені сповіщення - ви використовуєте один із серверів вашої компанії для передачі даних на користувацькі пристрої через службу Apple Push Notification (APN).

Далі в статті ми побачимо, як ми можемо дізнатись про обидва типи сповіщень. Почнемо спочатку зі вступу до цієї нової системи повідомлень, яку ми можемо використати для своєї справи.

Що нового в iOS-10 для сповіщень?

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

  • User Notifications Framework - керує локальними та віддаленими сповіщеннями.
  • User Notifications UI Framework - налаштовує зовнішній вигляд інтерфейсу сповіщень системи.

Ми будемо використовувати ці два фреймворки та деякі API для певної платформи для налаштування наших повідомлень.

Поряд із фреймворками, розширення програми Notification serviceбуло також представлено, що дозволяє змінювати вміст віддалених сповіщень до їх доставки.

Apple також дозволяє налаштувати інтерфейс вашого сповіщення за допомогою розширення вмісту Notification .

Це занадто багато, щоб пам'ятати? Так ... звичайно, це так. Але, не хвилюйтеся. Ми побачимо все поетапно разом із відповідним кодом. Просто спокійно. ?

Перш за все - налаштуйте це!

Запит на авторизацію

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

Отже, перш за все нам потрібно отримати дозвіл від користувача, якого ми збираємось повідомити. І це досить просто - лише два рядки коду, і ми закінчили:

Вам потрібно написати цей код у AppDelegate’sметоді - application:didFinishLaunchingWithOptions:перед поверненням з нього.

Зверніть увагу: оскільки система зберігає відповідь користувача, виклики requestAuthorization(options:completionHandler:)методу під час наступних запусків не вимагають від користувача повторного запрошення.

Додавання категорій та дій - активні сповіщення

Структура сповіщень користувачів підтримує додавання категорій та дій до сповіщень.

Категорії - Визначте типи сповіщень, які підтримує програма, та повідомте системі про те, як ми хочемо, щоб сповіщення відображалось.

Дії - Кожна категорія може мати до чотирьох дій, пов’язаних з нею. Дії - це, в основному, користувацькі кнопки, які при натисканні відхиляють інтерфейс сповіщення та пересилають вибрану дію до програми для негайної обробки.

Гаразд! І що це означає .. ??? Деякий код може допомогти вам краще зрозуміти:

У наведеному вище коді ми просто створили категорію із назвою ЗАПРОШЕННЯз чотирма різними діями - remindLater , прийняти , зниження , ікоментар .

Категорії та дії однозначно ідентифікуються за допомогою їх ідентифікаторів. Щоразу, коли доставляється повідомлення з категорією, система представляє повідомлення разом із усіма діями, пов’язаними з цією категорією, коли користувач її розширює. Ось як це буде виглядати:?

Визначте всі категорії та дії трохи нижче, де ви налаштували сповіщення в application:didFinishLaunchingWithOptions:методі.

Включіть ідентифікатор категорії (наприклад, ЗАПРОШЕННЯ) під час планування сповіщення, локально чи віддалено. Як це зробити, ми побачимо в наступному розділі.

Планування локальних сповіщень

Тепер, коли ми закінчили налаштовувати наші сповіщення, давайте подивимося, як насправді запланувати одне з додатка .

Планування локального сповіщення вимагає всього трьох простих кроків:

  1. Підготувати зміст
  2. Додати тригер - коли сповіщення повинно бути запущено
  3. Заплануйте це для доставки

Давайте швидко приступимо до коду, щоб ми не плуталися з усім, що тут відбувається. ЛОЛ ?

У наведеному вище коді, поряд з іншим вмістом, ми також надали 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:), де ми можемо забезпечити обробку, характерну для кожної дії.

Зверніть увагу: якщо програма не працює під час отримання відповіді, система запускає програму у фоновому режимі для обробки відповіді.

Віддалені сповіщення

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

Будь то соціальні медіа чи календар або будь-який з утиліт, ми можемо бачити їх майже скрізь. Від новинних додатків, які повідомляють нас про найновіший вміст, до самого Medium, який попереджає нас про останні опубліковані статті.

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

Але середній, наприклад, не має доступу до програми на нашому особистому пристрої, то як він може запланувати будь-які сповіщення? Точно так! Це не може. Це щось інше і щось більше, ніж просто місцеві.

Гаразд, як щодо того, щоб ми надіслали повідомлення з певної точки і показали його в інший момент - чи відповість це на наше запитання? Так, це точно буде. Але як це зробити? Це віддалені сповіщення .

Це саме те, що вони роблять. Це функція, яка вирішила ВЕЛИКУ ПРОБЛЕМУ «Постійне оновлення інформації».

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

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

Важливе зауваження : Ніколи не кешуйте маркери пристроїв у своєму додатку. Натомість отримуйте їх із системи, коли вони вам потрібні.

APN видає новому маркеру пристрою ваш додаток, коли відбуваються певні події. Гарантована різниця маркера пристрою, наприклад, коли користувач відновлює пристрій із резервної копії, коли користувач встановлює вашу програму на новий пристрій і коли користувач переінсталює операційну систему.

При спробі отримати маркер пристрою, але він не змінився, метод отримання швидко повертається.

Зверніть увагу: можливість APN-адрес надсилати віддалені сповіщення до не запущеної програми вимагає запуску програми хоча б один раз.

Як це насправді працює

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

  1. Додатокреєстри з APN
  2. APN надсилає маркер пристрою на Device with, а потім надсилає його в додаток
  3. Додаток надсилає цей маркер пристрою Постачальнику
  4. Постачальник надсилає повідомлення з цим маркером пристрою до APN, які потім надсилають його на Пристрій, який потім надсилає його в додаток .

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

Обробляйте це в додатку

Тепер, коли ми усвідомлюємо, що таке віддалені сповіщення та які речі потрібні, щоб вони працювали, давайте тепер перейдемо до того, як ми можемо змусити наш додаток підтримувати їх. Тому що нічого не відбувається самостійно?. Нам потрібно зробити кілька конфігурацій, щоб вони працювали.

Щоб мати можливість обробляти віддалені сповіщення, наш додаток повинен:

  1. Увімкніть віддалені сповіщення у можливостях - лише одним клацанням миші, і ви закінчили цей крок. На вкладці Можливості нашого проекту Xcode увімкніть опцію Push Notifications . Переконайтеся, що push-сповіщення додано до ідентифікатора програми, який ми використовуємо для проекту.

2. Зареєструйтесь у службі Apple Push Notification (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. змінного змісту- Щоб увімкнути модифікацію сповіщення за допомогою розширення Notification Service App , встановіть для нього значення 1.

Тут ви можете прочитати більше про налаштування корисного навантаження відповідно до ваших вимог. Це посилання на ключі, які ми можемо додати в словник aps

Розширення додатка служби сповіщень

На даний момент ми знаємо, що таке віддалені сповіщенняє, як вони працюють, що все, що нам потрібно, щоб вони працювали - майже все! Оскільки ми щойно змусили їх працювати ідеально✌️.

Тепер питання в тому, що, якщо ми хочемо змінити певний вміст у сповіщенні, отриманому від постачальника, перед тим, як представити його на пристрої? Що робити, якщо сповіщення містить посилання на зображення, яке нам потрібно завантажити, перш ніж доставити його користувачеві? Чи можемо ми це зробити з тим, що ми вже знаємо? У нас немає доступу до провайдера ... так як ми будемо?

Ми насправді не можемо. Ми не можемо змінити те, що отримуємо, але точно можемо змінити те, що представляємо.

Саме в цьому полягає розширення додатка Notification Service - зміна вмісту віддалених сповіщень перед доставкою. Це так просто, як здається. Ніякого вигадливого коду, нічого. Це насправді дуже просто.

Додавання розширення служби сповіщень до проекту

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

Передумови

Перш ніж ми почнемо модифікувати вміст, є деякі обмеження щодо того, коли вміст дозволено змінювати.

Вміст може бути змінений, лише якщо:

  • Віддалене сповіщення налаштовано на відображення попередження.
  • Словник aps віддаленого сповіщення включає ключ змінного вмісту зі значенням, встановленим на 1.

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

Отже, для підтримки будь-яких змін у вмісті сповіщень ці умови повинні бути виконані.

Змінення змісту

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

Він містить два методи:

  1. didReceive(_:withContentHandler:)- внесіть необхідні зміни до повідомлення та повідомте систему, коли закінчите. Цей метод має обмежений проміжок часу (близько 30 секунд) для виконання свого завдання та виконання наданого блоку завершення.
  2. serviceExtensionTimeWillExpire()- Повідомляє нам, що продовження продовжується. Дайте нам останній шанс подати наші зміни. Якщо ми не оновлюємо вміст сповіщення до закінчення часу, система відображає оригінальний вміст.

Давайте розглянемо приклад. Ми змінимо тіло в корисне навантаження в фрагменті коду 7 до « Адреси: Мушлі Квартири, Mumbai ».

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

Розширення вмісту сповіщень

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

І і і ... Apple знову тут, щоб виручити нас. Це розширення вмісту повідомлень . Це представляє власний інтерфейс для доставленого локалуабовіддалене сповіщення.

Додавання розширення вмісту повідомлень до проекту

Я думаю, ми вже знаємо, як це зробити. Чи не так? Ми перейдемо до того самого, що і для додавання розширення служби сповіщень . Виберіть Файл - Новий - Ціль - Розширення вмісту повідомлень.

Додавання деяких ключів до розширення Info.plist

Для підтримки користувацького інтерфейсу для локальних та віддалених сповіщень нам потрібно внести деякі зміни у файл Info.plist із розширенням вмісту.

  1. UNNotificationExtensionCategory (reqd.) - рядок або масив рядків. Кожен рядок містить ідентифікатор категорії, оголошеної програмою. Категорія , я повинен сказати, що це дійсно дуже важливо для отримання повідомлень. Спеціальний інтерфейс відображатиметься лише для сповіщень, що належать до зазначених категорій.
  2. UNNotificationExtensionInitialContentSizeRatio (вимог.) - число з плаваючою точкою, яке представляє початковий розмір подання контролера подання, виражене як відношення його висоти до ширини . Саме контролер перегляду ми будемо використовувати для створення користувацького інтерфейсу. Ми обговоримо це в наступному розділі.
  3. UNNotificationExtensionDefaultContentHidden - якщо true : показувати лише спеціальний вміст. Якщо хибне : показати власний + типовий вміст.
  4. UNNotificationExtensionOverridesDefaultTitle - якщо true : встановіть заголовок сповіщення на заголовок контролера перегляду. Якщо хибне : заголовок сповіщення встановлено на ім'я програми.

Ось ілюстрація, яка може допомогти нам краще зрозуміти наведені вище ключі.

На наведеному вище прикладі клавіші в Info.plist налаштовані як:

  1. UNNotificationExtentionCategory - ЗАПРОШЕННЯ
  2. UNNotificationExtensionInitialContentSizeRatio - 1
  3. UNNotificationExtensionDefaultContentHidden - хибне
  4. UNNotificationExtensionOverridesDefaultTitle - хибне

Створення користувацького інтерфейсу

Розширення вмісту повідомлень надає нам UIViewControllerвідповідність UNNotificationContentExtensionпротоколу. Цей контролер представляє інтерфейс сповіщення. StoryboardФайл в розширенні містить один ViewController , що ми можемо використовувати , щоб створити те , що ми хочемо , щоб UI повідомлення до теперішнього часу .

Після створення інтерфейсу нам потрібно зв’язати елементи NotificationViewControllerв, щоб заповнити деталі. Щоразу, коли надходить повідомлення з очікуваною категорією , ми отримуємо зворотний дзвінок UNNotificationContentExtension’sметодом - didReceive(_:). Це місце, де ми можемо додавати деталі до нашого індивідуального інтерфейсу.

Ми майже закінчили користувальницький інтерфейс нашого сповіщення. Ще 1 річ. Оскільки користувальницький інтерфейс додається до категорії сповіщень ,до цього можуть бути пов’язані деякі дії. І ... ви правильно зрозуміли! ? Ми будемо виконувати наші дії автоматично без будь-якої спеціальної обробки. Блискуче !?

Вміст + чудовий інтерфейс + користувацькі дії - все зроблено. Що ще ми можемо попросити? Apple, ти чудовий !?

Останній момент: ми також можемо додати обробку до спеціальних дій у розширенні. Система викликає didReceive(_:completionHandler:)метод реагування на вибрані дії. Якщо наш контролер перегляду не реалізує цей метод, система доставить обрану дію до вашого додатка для обробки.

У разі реалізації нам потрібно обробити всі можливі дії цього методу. Тут важливо одне - completionзакриття.

completion: Блок, який потрібно виконати, коли Ви закінчите виконувати дію. Ви повинні викликати цей блок у певний момент під час реалізації. Блок не має поверненого значення.

Закриття приймає один параметр dismissтипу UNNotificationContentExtensionResponseOption. Ми пропонуємо такі варіанти:

  1. doNotDismiss - Не відкидайте інтерфейс сповіщень.
  2. dismiss - Закрити інтерфейс сповіщення.
  3. dismissAndForwardAction--Закрийте інтерфейс сповіщення та перешліть його в додаток.

Це підсумовує наші сповіщення. Забагато пам’ятати? Практика робить прогрес ? Спробуйте зробити власні сповіщення зараз!

Зразок проекту

Ви можете завантажити зразок проекту звідси.

А зразок проекту для розширення вмісту повідомлень можна знайти тут.

Подальше читання

Не забудьте прочитати інші мої статті:

  1. Все про Codable в Swift 4
  2. Розфарбуйте його ГРАДІЄНТАМИ - iOS
  3. Кодування для iOS 11: Як перетягнути колекцію та таблиці
  4. Все, що вам потрібно знати про Today Extensions (Widget) у iOS 10
  5. Вибір UICollectionViewCell спрощений .. !!

Не соромтеся залишати коментарі, якщо у вас виникнуть запитання.