Кастомизация push-уведомлений в iOS
Когда iOS-устройство получает уведомление, содержащее оповещение (alert), система отображает его содержимое в два этапа. Сначала отображается сокращенный баннер с заголовком, подзаголовком и 2-4 строками основного текста уведомления. Если пользователь нажимает на сокращенный баннер, iOS отображает полный интерфейс уведомления, включая все связанные с ним действия. Система предоставляет интерфейс для сокращенного баннера, но вы можете кастомизировать полный интерфейс с помощью расширения контента уведомлений (notification content app extension).

Расширение контента уведомлений управляет контроллером представлений (view controller), который отображает ваш кастомный интерфейс уведомлений. Этот контроллер представлений может дополнять или заменять системный интерфейс по умолчанию для ваших уведомлений. Вы можете использовать ваш контроллер представлений, чтобы:
- Настраивать расположение элементов, включая заголовок, подзаголовок и основной текст оповещения.
- Заменять шрифты или стили для элементов интерфейса.
- Отображать данные, специфичные для приложения — например, данные, хранящиеся в специальных ключах полезной нагрузки (payload) уведомления.
- Включать кастомные изображения или брендинг.
Ваше расширение должно настраивать свой контроллер представлений, используя немедленно доступные данные, такие как содержимое уведомления и файлы, присутствующие в пакете (bundle) вашего расширения. Если вы используете группу приложений (app group) для обмена данными между вашим приложением и его расширением, вы также можете использовать любые файлы, найденные в группе приложений. Чтобы обеспечить своевременную доставку уведомлений, настраивайте представления как можно быстрее. Не выполняйте длительных задач, таких как попытка получить данные по сети.
Добавление расширения контента уведомлений в ваш проект
Section titled “Добавление расширения контента уведомлений в ваш проект”Чтобы добавить расширение контента уведомлений в ваше iOS-приложение:
- В Xcode выберите File > New > Target.
- В разделе iOS Application Extension выберите Notification Content Extension.
- Нажмите Next.
- Укажите имя вашего расширения.
- Нажмите Finish.
Добавление представлений в ваш контроллер представлений
Section titled “Добавление представлений в ваш контроллер представлений”Шаблон, предоставляемый Xcode, включает storyboard и контроллер представлений для настройки. Создайте свой кастомный интерфейс уведомлений, добавляя представления в ваш контроллер представлений. Например, используйте метки (labels) для отображения заголовка, подзаголовка и основного текста уведомления. Вы также можете добавлять представления изображений (image views) и представления, отображающие неинтерактивный контент. Вам не нужно предоставлять начальный контент для ваших представлений.
В iOS 12 и более поздних версиях вы можете добавлять интерактивные элементы управления (например, кнопки или переключатели). Для получения дополнительной информации см. раздел «Поддержка интерактивных элементов управления».
Настройка вашего контроллера представлений
Section titled “Настройка вашего контроллера представлений”Используйте метод didReceive(_:) вашего контроллера представлений для обновления его меток и других представлений. Полезная нагрузка (payload) уведомления содержит данные для настройки вашего контроллера представлений. Вы также можете использовать данные из других файлов вашего расширения. Листинг 1 показывает версию этого метода, которая извлекает заголовок и основной текст из полезной нагрузки уведомления и присваивает строки двум элементам управления UILabel, которые хранятся как аутлеты (outlets) в контроллере представлений.
// Настройка интерфейса уведомления во время выполнения
func didReceive(_ notification: UNNotification) { self.bodyText?.text = notification.request.content.body self.headlineText?.text = notification.request.content.title}Если второе уведомление приходит, когда ваш контроллер представлений уже виден, система снова вызывает метод didReceive(_:) с полезной нагрузкой нового уведомления.
Поддержка интерактивных элементов управления
Section titled “Поддержка интерактивных элементов управления”В iOS 12 и более поздних версиях вы можете включить взаимодействие с пользователем в ваших кастомных уведомлениях. Это позволяет добавлять интерактивные элементы управления, такие как кнопки и переключатели, в ваш кастомный интерфейс.
Чтобы включить взаимодействие с пользователем:
- Откройте файл
info.plistвашего расширения контента уведомлений (Notification Content Extension). - Добавьте ключ
UNNotificationExtensionUserInteractionEnabledв атрибуты вашего расширения. Присвойте ему булево значениеYES.

Добавление Apple Pay в расширение push-уведомлений (пример представления)
Section titled “Добавление Apple Pay в расширение push-уведомлений (пример представления)”Пример блока кода с кнопкой Apple Pay в расширении push-уведомлений
Section titled “Пример блока кода с кнопкой Apple Pay в расширении push-уведомлений”import UIKitimport Foundationimport UserNotificationsimport UserNotificationsUIimport PassKit
class NotificationViewController: UIViewController, UNNotificationContentExtension, PKPaymentAuthorizationViewControllerDelegate {
func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) { controller.dismiss(animated: true, completion: nil) }
@IBOutlet weak var buyWithApplePayButton: UIButton! @IBOutlet weak var containerView: UIView! @IBOutlet weak var payInAppButton: UIButton! @IBOutlet weak var segmentCustom: UISegmentedControl!
private var amount: NSDecimalNumber = 0;
override func viewDidLoad() { super.viewDidLoad()
buttonCustomisation()
amount = NSDecimalNumber.init(value: 5) }
func buttonCustomisation () { self.buyWithApplePayButton.layer.masksToBounds = true self.buyWithApplePayButton.layer.cornerRadius = 10 self.payInAppButton.layer.masksToBounds = true self.payInAppButton.layer.cornerRadius = 10 self.containerView.layer.borderColor = UIColor.gray.cgColor self.containerView.layer.borderWidth = 0.7 self.containerView.layer.masksToBounds = true self.containerView.layer.cornerRadius = 20 }
func didReceive(_ notification: UNNotification) { // Configuring the notification interface at runtime }
@IBAction func buyWithApplePayAction(_ sender: Any) { let request = PKPaymentRequest() request.merchantIdentifier = "merchant.com.sample.ApplePayAction" request.supportedNetworks = [PKPaymentNetwork.visa, PKPaymentNetwork.masterCard, PKPaymentNetwork.amex] request.merchantCapabilities = PKMerchantCapability.capability3DS request.countryCode = "US" request.currencyCode = "USD"
request.paymentSummaryItems = [ PKPaymentSummaryItem(label: "Some Product", amount: amount) ]
let applePayController = PKPaymentAuthorizationViewController(paymentRequest: request) applePayController?.delegate = self self.present(applePayController!, animated: true, completion: nil) }
@IBAction func payInAppButtonAction(_ sender: Any) { print("pay in app button tapped") }
@IBAction func segmentAction(_ sender: Any) { switch segmentCustom.selectedSegmentIndex { case 0: amount = NSDecimalNumber.init(value: 5) break case 1: amount = NSDecimalNumber.init(value: 10) break case 2: amount = NSDecimalNumber.init(value: 20) break default: amount = NSDecimalNumber.init(value: 5) break } }}