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

Как инициировал push уведомления на iOS устройстве

1.0 Junior🔥 102 комментариев
#Мобильное тестирование

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

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

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

Инициирование Push-уведомлений на iOS: Полный цикл от сервера до устройства

Процесс инициирования push-уведомлений на iOS — это многоэтапная процедура взаимодействия между вашим сервером (Provider), серверами Apple (APNs) и целевым iOS-устройством. Вот детальное объяснение каждого этапа.

Основные компоненты системы

  1. APNs (Apple Push Notification service) — облачный сервис Apple для доставки уведомлений
  2. Provider Server — ваш backend-сервер, который инициирует отправку
  3. Device Token — уникальный идентификатор устройства для целевой доставки
  4. Certificates/Keys — средства аутентификации для APNs

Полный процесс отправки push-уведомления

1. Подготовительный этап (настройка проекта)

Регистрация в Apple Developer Program и настройка сертификатов:

// В приложении (AppDelegate.swift) запрашиваем разрешение
import UserNotifications

func application(_ application: UIApplication, 
                didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    
    let center = UNUserNotificationCenter.current()
    center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
        if granted {
            DispatchQueue.main.async {
                application.registerForRemoteNotifications()
            }
        }
    }
    
    return true
}

2. Получение Device Token от APNs

После регистрации, APNs возвращает токен устройства:

// Успешная регистрация для пуш-уведомлений
func application(_ application: UIApplication, 
                didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    
    // Конвертируем Data в строку (hexadecimal format)
    let tokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
    print("Device Token: \(tokenString)")
    
    // Отправляем токен на ваш сервер
    sendTokenToServer(tokenString)
}

// Обработка ошибки регистрации
func application(_ application: UIApplication, 
                didFailToRegisterForRemoteNotificationsWithError error: Error) {
    print("Failed to register: \(error)")
}

3. Формирование payload (полезной нагрузки) на сервере

Ваш сервер формирует JSON-сообщение в соответствии со спецификацией Apple:

{
  "aps": {
    "alert": {
      "title": "Новое сообщение",
      "body": "Вам пришло новое сообщение от пользователя",
      "subtitle": "Важное уведомление"
    },
    "sound": "default",
    "badge": 1,
    "category": "MESSAGE_CATEGORY"
  },
  "custom_data": {
    "message_id": "12345",
    "sender_id": "user_678",
    "type": "private_message"
  }
}

4. Отправка уведомления через APNs

Используя HTTP/2 API (рекомендуемый современный способ):

# Пример на Python с использованием библиотеки pyapns2
import http.client
import json
import ssl

def send_push_notification_http2(device_token, payload, certificate_path, key_path):
    # Подключение к APNs
    conn = http.client.HTTPSConnection(
        "api.push.apple.com",
        context=ssl.create_default_context()
    )
    
    # Заголовки запроса
    headers = {
        "apns-topic": "com.yourapp.bundle",  # Bundle ID вашего приложения
        "apns-push-type": "alert",
        "apns-priority": "10",  # Немедленная доставка
        "authorization": "bearer YOUR_JWT_TOKEN"  # Для токенной аутентификации
    }
    
    # Формирование пути
    path = f"/3/device/{device_token}"
    
    # Отправка запроса
    conn.request("POST", path, json.dumps(payload), headers)
    
    # Получение ответа
    response = conn.getresponse()
    print(f"Status: {response.status}")
    print(f"Reason: {response.reason}")
    
    conn.close()

5. Аутентификация с APNs

Два основных метода аутентификации:

  • Токены JWT (рекомендуется) — JSON Web Tokens, подписанные приватным ключом
  • Сертификаты — TLS-сертификаты, выпущенные через Apple Developer Portal
# Пример генерации JWT токена для аутентификации
import jwt
import time

def generate_apns_jwt():
    # Параметры для JWT
    headers = {
        "alg": "ES256",
        "kid": "YOUR_KEY_ID"  # Key ID из Apple Developer Portal
    }
    
    payload = {
        "iss": "YOUR_TEAM_ID",  # Team ID
        "iat": int(time.time())
    }
    
    # Чтение приватного ключа
    with open("AuthKey_XXX.p8", "r") as key_file:
        private_key = key_file.read()
    
    # Генерация токена
    token = jwt.encode(payload, private_key, algorithm="ES256", headers=headers)
    return token

Критические аспекты тестирования QA Engineer

Максимальные ограничения payload:

  • 4KB для iOS 8 и выше (ранее было 2KB)
  • Ограничение sound файла: 30 секунд, 5MB
  • Обрезка длинных текстов: iOS автоматически обрезает длинные сообщения

Сценарии для тестирования:

  1. Положительные сценарии:

    • Получение уведомления при запущенном приложении
    • Получение уведомления при свернутом приложении
    • Получение уведомления при выключенном экране
    • Обработка нажатия на уведомление
  2. Отрицательные сценарии:

    • Отправка с неверным device token
    • Отправка с просроченным сертификатом/токеном
    • Отправка пустого payload
    • Превышение лимита размера payload
    • Отправка на устройство с отключенными уведомлениями
  3. Пограничные случаи:

    • Одновременная отправка множества уведомлений
    • Уведомления с UNNotificationAttachment (медиа-вложения)
    • Interactive уведомления с кастомными действиями
    • Silent push notifications для фонового обновления

Мониторинг и отладка

  • Сервисные коды ответа APNs: 200 (успех), 400 (ошибка запроса), 403 (ошибка аутентификации), 410 (device token больше не активен)
  • Использование Console.app на macOS для просмотра логов устройств
  • Инструменты для тестирования: Postman, NWPusher, собственные тестовые утилиты

Правильная инициализация push-уведомлений требует четкого понимания всей цепочки: от настройки проекта в Xcode и получения device token до формирования правильного payload на сервере и корректной аутентификации с APNs. Для QA Engineer особенно важно тестировать не только happy path, но и все возможные сценарии ошибок и пограничные случаи.

Как инициировал push уведомления на iOS устройстве | PrepBro