← Назад к вопросам
Какие настройки проекта необходимы для работы 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 с правильной аутентификацией).