← Назад к вопросам

Какие настройки проекта необходимы для работы push-уведомлений?

2.0 Middle🔥 181 комментариев
#Язык Swift

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Настройки проекта для работы Push-уведомлений в iOS

Для успешной интеграции push-уведомлений в iOS-приложении необходимо выполнить ряд ключевых настроек на стороне проекта, сервера и аккаунта разработчика. Вот пошаговая инструкция.

1. Регистрация в Apple Developer Program и создание сертификатов

  • Членство в программе: Убедитесь, что у вас есть активное членство в Apple Developer Program.
  • Идентификатор приложения (App ID): В разделе Certificates, Identifiers & Profiles создайте App ID с явным идентификатором (не Wildcard). Включите в его конфигурации Push Notifications (он будет в статусе "Configurable", а после создания ключа/сертификата — "Enabled").
  • Ключ APNs (рекомендуемый способ):
    *   В разделе **Keys** создайте новый ключ.
    *   Отметьте опцию **Apple Push Notifications service (APNs)**.
    *   Скачайте файл `.p8` **ТОЛЬКО ОДИН РАЗ** — его нельзя скачать повторно.
    *   Запишите **Key ID** и **Team ID**. Они понадобятся для настройки сервера.
  • Сертификат APNs (альтернативный, более старый способ):
    *   Создайте **Development** и/или **Production** SSL-сертификаты для вашего App ID.
    *   Скачайте их и установите в связку ключей (Keychain Access) на вашем Mac.
    *   Экспортируйте их как `.p12` файлы для использования на сервере.

2. Настройка Xcode проекта

  • Подпись (Signing & Capabilities): В настройках целевого приложения (Target) добавьте возможность Push Notifications на вкладке Signing & Capabilities. Xcode автоматически обновит ваш App ID и профиль.
  • Фондовые режимы (Background Modes): При необходимости доставки уведомлений, которые требуют выполнения фоновых задач (например, VoIP, критичные оповещения), добавьте соответствующую Background Mode. Для стандартных уведомлений это не требуется.
  • Инициализация и запрос разрешения: Регистрация для получения уведомлений происходит в коде.
import UserNotifications

class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        // 1. Запрос авторизации
        let center = UNUserNotificationCenter.current()
        center.delegate = self // Установите делегат для обработки уведомлений, пришедших в foreground

        center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
            if granted {
                print("Разрешение получено.")
                // 2. Регистрация на получение device token
                DispatchQueue.main.async {
                    application.registerForRemoteNotifications()
                }
            } else {
                print("Разрешение отклонено.")
            }
        }
        return true
    }

    // 3. Успешная регистрация в APNs, получение device token
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        let tokenParts = deviceToken.map { data in String(format: "%02.2hhx", data) }
        let token = tokenParts.joined()
        print("Device Token: \(token)")
        // ОТПРАВЬТЕ ЭТОТ ТОКЕН НА ВАШ СЕРВЕР
    }

    // 4. Обработка неудачной регистрации
    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        print("Не удалось зарегистрироваться в APNs: \(error)")
    }
}

// 5. Обработка входящих уведомлений (для iOS 10+)
extension AppDelegate: UNUserNotificationCenterDelegate {
    // Уведомление получено, когда приложение на переднем плане (foreground)
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        // Можете решить, как показывать уведомление
        completionHandler([.banner, .sound, .badge])
    }

    // Пользователь взаимодействовал с уведомлением (тапнул)
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {
        let userInfo = response.notification.request.content.userInfo
        // Обработайте данные (deep link, открытие экрана и т.д.)
        completionHandler()
    }
}

3. Настройка сервера (Backend)

Сервер должен уметь отправлять запросы к APNs (Apple Push Notification service). Для этого ему необходимо:

  • Использовать токен устройства (Device Token), полученный от конкретного экземпляра приложения.
  • Аутентифицироваться в APNs одним из двух способов:
    1.  **JWT на основе ключа .p8 (рекомендуется):** Сервер генерирует JWT-токен, подписанный закрытым ключом `.p8`, используя `Key ID`, `Team ID` и `App ID`. Этот токен периодически обновляется (раз в час).
    2.  **Сертификат .p12:** Использовать SSL-сертификат, установленный на сервере.
  • Формировать правильный HTTP/2 запрос к одному из эндпоинтов APNs:
    *   `https://api.sandbox.push.apple.com:443/3/device/<device_token>` (для разработки)
    *   `https://api.push.apple.com:443/3/device/<device_token>` (для продакшена)
  • Правильно формировать JSON-полезную нагрузку (payload) уведомления в соответствии со спецификацией Apple.
Пример payload:
{
    "aps": {
        "alert": {
            "title": "Привет!",
            "body": "Это тестовое уведомление."
        },
        "sound": "default",
        "badge": 1
    },
    "customData": "some_value"
}

4. Дополнительные требования

  • Provisioning Profile: Убедитесь, что используемый профиль provisioning создан на основе App ID с поддержкой Push Notifications. Обычно Xcode делает это автоматически.
  • Физическое устройство: Тестирование push-уведомлений невозможно на симуляторе. Необходимо использовать реальное устройство, на которое установлен Development provisioning profile.
  • Продакшн vs Разработка: Четко разделяйте development (sandbox) и production окружения. Они используют разные device token и разные эндпоинты APNs. Сертификаты/ключи для них также могут быть разными.
  • Обработка разрешений: Будьте готовы к тому, что пользователь может отключить уведомления. Рекомендуется вежливо объяснять их пользу и предоставлять возможность перенаправить в настройки системы (UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!)).

Итог: Настройка требует слаженных действий в Developer Portal (создание идентификаторов и ключей), в Xcode (добавление capability и написание кода регистрации) и на backend-сервере (реализация отправки запросов к APNs с правильной аутентификацией).

Какие настройки проекта необходимы для работы push-уведомлений? | PrepBro