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
- В Apple Developer → Keys создайте ключ с включённым Apple Push Notifications service (APNs), скачайте
.p8(он скачивается один раз) и запомните Key ID; Team ID — в правом верхнем углу портала. - В дашборде откройте Приложения → ваше приложение → Провайдеры 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:
.package(url: "https://github.com/pushdata-ru/pushdata-ios", from: "0.1.0")5. Инициализация и регистрация
Самый короткий путь — унаследовать делегат приложения от PushDataAppDelegate: он запрашивает разрешение при запуске, регистрирует токен и отмечает события из колбэков центра уведомлений.
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).
Без готового делегата — вызовы по отдельности:
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. Вход и выход пользователя
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. Проверка
- Соберите приложение на устройство, разрешите уведомления.
- Приложения → ваше приложение → Устройства: появилась строка с платформой iOS и вашим
user_id. - Отправить уведомление → цель «пользователь» или «устройство» → push приходит на телефон; в карточке уведомления растут
deliveredиopened.
| Симптом | Проверьте |
|---|---|
no valid aps-environment entitlement | добавлена capability Push Notifications, профиль пересоздан, Clean Build Folder |
401 unauthorized | publicKey — ключ 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.