Ответ
Интеграция push-уведомлений (Remote Notifications) в iOS требует настройки как на стороне приложения, так и на сервере, а также взаимодействия с сервисом Apple Push Notification service (APNs).
Основные шаги реализации:
-
Настройка проекта:
- В Apple Developer Account включите Push Notifications для App ID.
- В Xcode добавьте capability "Push Notifications" и "Background Modes" (опционально, для фоновых уведомлений).
- Сгенерируйте и загрузите сертификат или ключ (Auth Key) для APNs в личном кабинете разработчика.
-
Запрос разрешения у пользователя (обязательный шаг): Используйте
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.") } } -
Регистрация устройства в 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)") } -
Обработка входящего уведомления: Для 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 (или библиотеку) для отправки уведомлений на конкретные токены.