PD Документация ← На главную

iOS SDK

Swift-пакет PushDataClient регистрирует устройство в PushData по токену APNs, снимает его при выходе и сообщает о доставке, открытии и клике. Работает только с публичным ключом приложения (pk_…), который можно хранить в бинарнике; отправки и контакты — с вашего сервера, секретным ключом.

Пакет публикуется. Пока публичный репозиторий pushdata-ru/pushdata-ios не открыт, подключите каталог ios/package из репозитория PushData как локальный Swift-пакет (File → Add Package Dependencies → Add Local…). API и шаги руководства те же.

Требования: iOS 15+, Xcode 15+, аккаунт Apple Developer, физическое устройство (APNs не доставляет в симулятор).

1. Ключи приложения

В дашборде откройте Приложения → ваше приложение → Настройки: понадобятся ID приложения и публичный ключ pk_… (раздел «API-ключи»). Секретный ключ pd_… в приложение не попадает.

2. Ключ APNs в PushData

  1. В Apple Developer → Keys создайте ключ с включённым Apple Push Notifications service (APNs), скачайте .p8 (он скачивается один раз) и запомните Key ID; Team ID — в правом верхнем углу портала.
  2. В дашборде откройте Приложения → ваше приложение → Провайдеры Push → APNs, вставьте содержимое .p8, Key ID, Team ID и Bundle ID приложения. Один ключ обслуживает и sandbox, и production.

3. Проект в Xcode

  • Signing & Capabilities → + Capability → Push Notifications; для тихих push — Background Modes → Remote notifications.
  • Bundle ID проекта совпадает с тем, что указан у провайдера APNs.

4. Установка пакета

File → Add Package Dependencies…, URL пакета https://github.com/pushdata-ru/pushdata-ios, библиотека PushDataClient. Или в Package.swift:

swift
.package(url: "https://github.com/pushdata-ru/pushdata-ios", from: "0.1.0")

5. Инициализация и регистрация

Самый короткий путь — унаследовать делегат приложения от PushDataAppDelegate: он запрашивает разрешение при запуске, регистрирует токен и отмечает события из колбэков центра уведомлений.

swift
import PushDataClient

@main
class AppDelegate: PushDataAppDelegate {
    // Пользователь, которому принадлежит устройство при запуске (nil — анонимное устройство).
    override var initialUserId: String? { Session.current?.userId }

    override func makePushDataClient() -> PushDataClient? {
        PushDataClient(
            appId: "APP_ID",           // Приложения → Настройки
            publicKey: "pk_…",         // Приложения → Настройки → API-ключи (публичный)
            // При включённой проверке идентичности — HMAC id пользователя с вашего сервера (шаг 8):
            identityHash: { userId in try await Backend.identityHash(for: userId) }
        )
    }
}

SwiftUI: подключите тот же делегат через @UIApplicationDelegateAdaptor(AppDelegate.self).

Без готового делегата — вызовы по отдельности:

swift
let client = PushDataClient(appId: "APP_ID", publicKey: "pk_…")

try await client.initialize(userId: "user-123")     // разрешение + запрос токена у iOS
// application(_:didRegisterForRemoteNotificationsWithDeviceToken:)
await client.handleDeviceToken(deviceToken)           // POST /api/v1/public/devices
// центр уведомлений
client.handleNotification(userInfo)                   // delivered (willPresent)
if let ids = PushDataClient.trackingIds(from: userInfo) {
    await client.trackNotificationOpened(notificationId: ids.notificationId, deviceId: ids.deviceId)
}

Окружение APNs SDK определяет сам: sandbox для Debug-сборки, production для TestFlight и App Store (PushDataClient.Environment.automatic).

6. Вход и выход пользователя

swift
try await client.updateUserId("user-456")   // после входа: устройство переходит пользователю
try await client.unregister()               // при выходе: устройство перестаёт получать его push

Один токен — одно устройство: повторная регистрация под другим userId переводит устройство новому пользователю.

7. События

В payload каждого push PushData кладёт pushdata_notification_id и pushdata_device_id. PushDataAppDelegate отмечает delivered для push, пришедшего в foreground, opened для тапа и clicked (с идентификатором действия) для кнопки уведомления. Для push, пришедших в фоне, отметьте delivered из Notification Service Extension тем же handleNotification(userInfo).

8. Проверка идентичности

При включённой Приложения → Настройки → Проверка идентичности регистрация с userId должна нести заголовок X-Identity-Hash — hex HMAC-SHA256 от id пользователя на секрете идентичности приложения. Секрет не покидает ваш сервер: сделайте авторизованный эндпоинт, который возвращает хэш для текущего пользователя, и передайте его в identityHash:. Без него PushData ответит 401 identity_unverified. Анонимным устройствам хэш не нужен.

9. Проверка

  1. Соберите приложение на устройство, разрешите уведомления.
  2. Приложения → ваше приложение → Устройства: появилась строка с платформой iOS и вашим user_id.
  3. Отправить уведомление → цель «пользователь» или «устройство» → push приходит на телефон; в карточке уведомления растут delivered и opened.
СимптомПроверьте
no valid aps-environment entitlementдобавлена capability Push Notifications, профиль пересоздан, Clean Build Folder
401 unauthorizedpublicKey — ключ pk_ именно этого приложения
401 identity_unverifiedпроверка идентичности включена — передайте identityHash или регистрируйте анонимно
токен не приходитфизическое устройство, интернет, capability и профиль на месте
push отправлен, ничего не пришлоKey ID / Team ID / Bundle ID у провайдера совпадают с приложением; sandbox для Debug, production для TestFlight; устройство в статусе ACTIVE

Ошибки SDK — PushDataError.api(status:code:message:) с кодом сервиса (unauthorized, identity_unverified, validation_error, not_found, rate_limited), .permissionDenied, .invalidResponse.