Какие основные шаги для реализации получения push-уведомлений в iOS?

«Какие основные шаги для реализации получения push-уведомлений в iOS?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Интеграция push-уведомлений (Remote Notifications) в iOS требует настройки как на стороне приложения, так и на сервере, а также взаимодействия с сервисом Apple Push Notification service (APNs).

Основные шаги реализации:

  1. Настройка проекта:

    • В Apple Developer Account включите Push Notifications для App ID.
    • В Xcode добавьте capability "Push Notifications" и "Background Modes" (опционально, для фоновых уведомлений).
    • Сгенерируйте и загрузите сертификат или ключ (Auth Key) для APNs в личном кабинете разработчика.
  2. Запрос разрешения у пользователя (обязательный шаг): Используйте UNUserNotificationCenter. Запрос должен быть контекстуальным.

    import UserNotifications
    
    let center = UNUserNotificationCenter.current()
    center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
        if granted {
            print("Permission granted.")
            // Регистрация для remote-уведомлений должна выполняться в главном потоке
            DispatchQueue.main.async {
                UIApplication.shared.registerForRemoteNotifications()
            }
        } else {
            print("Permission denied.")
        }
    }
  3. Регистрация устройства в APNs и получение токена: Система автоматически связывается с APNs. Токен устройства уникален для комбинации "приложение + устройство" и может меняться.

    // Успешная регистрация (AppDelegate или SceneDelegate)
    func application(_ application: UIApplication,
                     didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        // Конвертируем Data в строку (формат может быть нужен для вашего сервера)
        let tokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
        print("APNs Device Token: (tokenString)")
        // ОТПРАВЬТЕ этот токен на ваш backend-сервер.
    }
    
    // Ошибка регистрации
    func application(_ application: UIApplication,
                     didFailToRegisterForRemoteNotificationsWithError error: Error) {
        print("Failed to register for remote notifications: (error)")
    }
  4. Обработка входящего уведомления: Для iOS 10+ реализуйте UNUserNotificationCenterDelegate.

    // Уведомление получено, когда приложение на переднем плане
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: 
                                @escaping (UNNotificationPresentationOptions) -> Void) {
        // Решаем, как показать уведомление (.banner, .sound, .badge)
        completionHandler([.banner, .sound])
    }
    
    // Пользователь тапнул по уведомлению
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {
        let userInfo = response.notification.request.content.userInfo
        // Извлеките данные и выполните навигацию в приложении
        completionHandler()
    }

Ключевой момент: Ваш сервер должен хранить токены устройств и использовать APNs API (или библиотеку) для отправки уведомлений на конкретные токены.