Работа с UserNotifications в iOS на Swift

Автор: | 09.08.2026

Локальные уведомления — это ключевая функция во многих приложениях, и в Swift их легко добавить в любой проект. Начиная с iOS 10, с помощью UserNotifications можно даже отображать GIF-изображения в уведомлениях.

Давайте создадим простое приложение для отображения локального `UserNotification`, содержащего GIF на тему SEGA и запрос пользователю о продолжении получения уведомлений.

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

В этом приложении используются несколько зависимостей:

— Alamofire для отправки HTTP-запросов к API Giphy.

— SwiftyJSON для работы с JSON-ответами.

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

Для установки зависимостей воспользуемся CocoaPods. Сначала установите CocoaPods, если он у вас еще не установлен:

Теперь установите зависимости, выполнив следующую команду в директории, где находится наш `Podfile`:

CocoaPods связывает зависимости проекта, создавая новую рабочую область Xcode. Чтобы Xcode загрузил эти зависимости, откройте рабочую область с помощью файла `PlayingWithUserNotifications.xcworkspace`, а не файла проекта Xcode:

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

Прежде чем отправлять уведомления, приложение должно запросить разрешение у пользователя в `AppDelegate.swift`. Замените код в методе `application(_:didFinishLaunchingWithOptions:)` следующим, чтобы приложение запрашивало разрешение на отправку уведомлений при запуске:

Обратите внимание, что перед возвратом мы устанавливаем делегат `UNUserNotificationCenter` на `self`.

Прежде чем закончить с `AppDelegate.swift`, добавьте расширение в конец файла для обработки логики центра уведомлений:

Теперь перейдите в `ViewController.swift`, чтобы начать писать код для отправки уведомлений. Добавьте идентификатор для нашего уведомления в класс `ViewController`:

Затем добавьте метод в `ViewController` для планирования самого уведомления:

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

— Мы создаем объект `UNMutableNotificationContent` и задаем содержимое уведомления.

— Затем создаем `UNTimeIntervalNotificationTrigger` — триггер для уведомления. В данном случае мы планируем уведомление на количество секунд, переданное в эту функцию-обертку.

— После этого создаем объект `UNNotificationRequest` для нашего идентификатора уведомления, содержимого и триггера.

— Наконец, добавляем запрос на уведомление в `UNUserNotificationCenter`.

После этого вызываем новый метод `scheduleNotification` при нажатии кнопки в приложении. Добавьте следующий код в метод `notificationButtonTapped`:

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

Это было круто, но давайте немного оживим уведомление с помощью 16-битной крутости.

Чтобы добавить GIF-изображения в уведомления, воспользуемся API Giphy. Создадим класс-обертку для работы с этим API. Создайте файл `GiphyManager.swift` и добавьте в него следующий код:

Это обертка для REST API Giphy, аналогичная той, что я использовал в своем руководстве по PromiseKit. Этот класс предоставляет метод, который получает URL случайного GIF на Giphy по заданному запросу.

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

Создайте новый Swift-файл под названием `NotificationManager.swift` и добавьте в него следующий код:

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

В этом классе есть новый метод `scheduleNotification`, который в основном повторяет тот, что мы писали ранее в `ViewController.swift`, но с логикой для обработки вложений.

Также есть метод для обработки изображений-вложений для наших уведомлений. Эта функция возвращает Promise и принимает URL от Giphy. Затем она загружает изображение и сохраняет его в файл. URL этого файла передается в следующую функцию цепочки.

Метод `createNotification` — это то, что мы будем вызывать из `ViewController.swift` при нажатии кнопки в приложении. Он запускает цепочку вызовов, которая получает изображение с Giphy, подготавливает его для вложения в уведомление и затем планирует отправку этого уведомления.

Теперь вернитесь в `ViewController.swift` и удалите ранее написанный код: как функцию `scheduleNotification`, так и строку `let notificationIdentifier = «myNotification»` в начале класса.

Замените код в методе `notificationButtonTapped` следующим, чтобы создать уведомление:

Запустите приложение, и ваше уведомление должно содержать крутой GIF на тему SEGA.

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

Нам нужно добавить идентификатор категории в уведомление для опций подтверждения. В `NotificationManager.swift` добавьте выделенную строку в метод `scheduleNotification`:

Теперь перейдите в `AppDelegate.swift`, чтобы создать действия, которые будут добавлены в это уведомление. Замените код в методе `application(_:didFinishLaunchingWithOptions:)` следующим:

Осталось только обновить расширение, которое мы ранее создали в `AppDelegate.swift`, и добавить метод для определения действий при нажатии пользователем на опцию «Да». В данном случае мы просто снова вызываем `createNotification`. Замените это расширение следующим кодом:

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

Теперь вы можете отправлять локальные UserNotifications с GIF-изображениями и даже получать ответы! Это только начало в мире уведомлений. Вы можете отправлять уведомления с удаленного сервера, если захотите, и даже использовать Twilio Notify для отправки push-уведомлений.

— Email: sagnew@twilio.com

— Twitter: @Sagnewshreds

— Github: Sagnew

— Twitch (стримы живого кодинга): Sagnewshreds