Публичный API SDK
SDK собран из модулей: обязательного Core и опциональных Push, Target, Profile, In-App. Каждый модуль подключается отдельной зависимостью и открывается через соответствующее свойство объекта AltcraftSDK.shared:
AltcraftSDK.shared // Core: инициализация, аутентификация, события, очистка
AltcraftSDK.shared.authFunctions // Core: аутентификация пол ьзователя
AltcraftSDK.shared.push // Push: подписки, токены, уведомления
AltcraftSDK.shared.target // Target: отправка целей
AltcraftSDK.shared.profile // Profile: поля профиля
AltcraftSDK.shared.inApp // In-App: кампании и подписки
Core (обязательный модуль)
class AltcraftSDK
AltcraftSDK
// Синглтон — точка входа в SDK
├─ static let shared: AltcraftSDK
// Инициализация SDK и установка конфигурации (completion вызывается на main)
├─ func initialization(
│ configuration: AltcraftConfiguration?,
│ completion: (@Sendable (Bool) -> Void)? = nil
│ ): Void
// Полная очистка данных SDK (кэш, БД, настройки), затем вызов completion
├─ func clear(completion: (() -> Void)? = nil): Void
// Установка App Group и и нициализация Core Data под shared-контейнер
├─ func setAppGroup(groupName: String?): Void
// Регистрация JWT-провайдера для получения токенов
├─ public func setJWTProvider(provider: JWTInterface): Void
// Полная очистка данных SDK (кэш/БД/настройки), затем вызов completion
├─ public func clear(completion: (() -> Void)? = nil): Void
|
// Поток SDK-событий (один активный подписчик)
├─ public let eventSDKFunctions: SDKEvents
│ // Подписаться на события SDK (заменяет существующего подписчика)
│ ├─ func subscribe(callback: @escaping (Event) -> Void): Void
│ // Отписаться от событий (колбэк остаётся назначенным, доставка останавливается)
│ ├─ func unsubscribe(): Void
│ // Модель события (базовый тип для всех событий/ошибок)
│ ├─ Event
│ │ // Базовая модель события
│ │ id: UUID
│ │ function: String
│ │ message: String?
│ │ eventCode: Int?
│ │ value: [String: Any?]?
│ │ date: Date
│ │ // Конструктор (нормализация function, фильтрация nil в value)
│ │ init(function: String, message: String? = nil, eventCode: Int? = nil, value: [String: Any?]? = nil, date: Date = Date())
│ │ // Сравнение по уникальному id
│ │ static func ==(lhs: Event, rhs: Event) -> Bool
│ │ // Хеширование по id
│ │ func hash(into hasher: inout Hasher): Void
│ │
│ │ // Ошибки без повторов (4xx-класс)
│ │ ErrorEvent : Event
│ │ init(function: String, message: String? = nil, eventCode: Int? = nil, value: [String: Any?]? = nil, date: Date = Date())
│ │
│ │ // Повторяемые ошибки (обычно 5xx)
│ │ RetryEvent : ErrorEvent
│ │ init(function: String, message: String? = nil, eventCode: Int? = 0, value: [String: Any?]? = nil, date: Date = Date())
|
// Управление push-токенами и провайдерами (FCM/HMS/APNs)
├─ public let pushTokenFunctions: PublicPushTokenFunctions
│ // Установить провайдера Firebase Cloud Messaging (nil — снять)
│ ├─ public func setFCMTokenProvider(_ provider: FCMInterface?): Void
│ // Установить провайдера Huawei Mobile Services (nil — снять)
│ ├─ public func setHMSTokenProvider(_ provider: HMSInterface?): Void
│ // Установить провайдера Apple Push Notification service (nil — снять)
│ ├─ public func setAPNSTokenProvider(_ provider: APNSInterface?): Void
│ // Асинхронно получить текущий push-токен (completion опционален)
│ ├─ public func getPushToken(completion: ((TokenData?) -> Void)? = nil): Void
│ // Сохранить токен вручную (String для FCM/HMS, Data для APNs); provider: "ios-firebase" | "ios-huawei" | "ios-apns"
│ ├─ public func setPushToken(provider: String, pushToken: Any?): Void
│ // Применить новый приоритет провайдеров и инициировать обновление токена
│ ├─ public func changePushProviderPriorityList(_ list: [String]): Void
│ // Удалить токен выбранного провайдера и вызвать completion
│ ├─ public func deleteDeviceToken(provider: String, completion: @escaping () -> Void): Void
│ // Форсировать обновление токена (определить провайдера —> удалить (кроме APNs) —> запросит ь новый)
│ └─ public func forcedTokenUpdate(completion: (() -> Void)? = nil): Void
|
// Управление подпиской на push (изменение статуса, запросы статуса)
├─ public let pushSubscriptionFunctions: PublicPushSubscriptionFunctions
│ // Оформить подписку (status = SUBSCRIBED)
│ ├─ public func pushSubscribe(
│ │ sync: Bool = true,
│ │ profileFields: [String: Any?]? = nil,
│ │ customFields: [String: Any?]? = nil,
│ │ cats: [CategoryData]? = nil,
│ │ replace: Bool? = nil,
│ │ skipTriggers: Bool? = nil
│ │ ): Void
│ // Отписаться (status = UNSUBSCRIBED)
│ ├─ public func pushUnSubscribe(
│ │ sync: Bool = true,
│ │ profileFields: [String: Any?]? = nil,
│ │ customFields: [String: Any?]? = nil,
│ │ cats: [CategoryData]? = nil,
│ │ replace: Bool? = nil,
│ │ skipTriggers: Bool? = nil
│ │ ): Void
│ // Приостановить (status = SUSPENDED)
│ ├─ public func pushSuspend(
│ │ sync: Bool = true,
│ │ profileFields: [String: Any?]? = nil,
│ │ customFields: [String: Any?]? = nil,
│ │ cats: [CategoryData]? = nil,
│ │ replace: Bool? = nil,
│ │ skipTriggers: Bool? = nil
│ │ ): Void
│ // UnSuspend подписки (один запрос, без ретраев/персиста)
│ ├─ public func unSuspendPushSubscription(
│ │ completion: @escaping (ResponseWithHttp?) -> Void
│ │ ): Void
│ // Статус последней подписки профиля
│ ├─ public func getStatusOfLatestSubscription(
│ │ completion: @escaping (ResponseWithHttp?) -> Void
│ │ ): Void
│ // Статус подписки, соответствующий текущим токену/провайдеру
│ ├─ public func getStatusForCurrentSubscription(
│ │ completion: @escaping (ResponseWithHttp?) -> Void
│ │ ): Void
│ // Статус последней подписки по провайдеру (если nil — использует ся текущий)
│ └─ public func getStatusOfLatestSubscriptionForProvider(
│ │ provider: String? = nil,
│ │ completion: @escaping (ResponseWithHttp?) -> Void
│ │ ): Void
| // добавить функциональное поле профиля(set/incr/...)
| └─ public func actionField(key: String) -> ActionFieldBuilder
|
| // Регистрация мобильных событий
├─ public let mobileEventFunctions: PublicMobileEventFunctions
│ // Регистрирует мобильное событие Altcraft
│ └─ public func mobileEvent(
│ sid: String,
│ altcraftClientID: String = "",
│ eventName: String,
│ sendMessageId: String? = nil,
│ payload: [String: Any?]? = nil,
│ matching: [String: Any?]? = nil,
│ matchingType: String? = nil,
│ profileFields: [String: Any?]? = nil,
│ subscription: (any Subscription)? = nil,
│ utm: UTM? = nil
│ ): Void
|
| // Обновление полей профиля
├─ public let profileFunctions: PublicProfileFunctions
│ // Обновляет поля профиля Altcraft
│ └─ public func updateProfileFields(
│ profileFields: [String: Any?]? = nil,
│ skipTriggers: Bool? = nil
│ ): Void
|
// ручная отправка пуш-событий (delivery/open)
├─ public let pushEventFunctions: PublicPushEventFunctions
│ // Зафиксировать доставку Altcraft-push (вызывает delivery-эвент)
│ ├─ public func deliveryEvent(from request: UNNotificationRequest): Void
│ // Зафиксировать открытие Altcraft-push (вызывает open-эвент)
│ └─ public func openEvent(from request: UNNotificationRequest): Void
|
├─ func setJWTProvider(provider: JWTInterface): Void
// Доступ к событиям SDK (один подписчик)
├─ let eventSDKFunctions: SDKEvents
// Доступ к аутентификации пользователя
├─ let authFunctions: AuthAPI
// Регистрация периодических фоновых задач (BGAppRefreshTask)
├─ let backgroundTasks: BackgroundTask
// Доступ к опциональным модулям
├─ var push: Push
├─ var target: Target
├─ var profile: Profile
└─ var inApp: InApp
class AuthAPI
AuthAPI
// Аутентификация пользователя
├─ func authenticate(): Void
// Выход пользователя (восстановление анонимной сессии)
└─ func logOut(): Void
class SDKEvents
SDKEvents
// Подписаться на события SDK (заменяет существующего подписчика)
├─ func subscribe(callback: @escaping (Event) -> Void): Void
// Отписаться от событий SDK
└─ func unsubscribe(): Void
CoreEvents — публичные события Core-модуля
CoreEvents
// Общие события SDK
├─ configSet // SDK configuration is installed
├─ sdkCleared // SDK data has been cleared
├─ userLogOut // User logged out. Anonymous session started
├─ backgroundTaskRegister // SDK background task is registered
├─ backgroundTaskCompleted // SDK background task completed
// Ошибки состояния и окружения
├─ notAuthenticatedError // user is not authenticated
├─ appGroupIsNotSet // App Group name was not set
├─ coreDataError // error in CoreData. Re-initialize the SDK
├─ permissionDenied // notification permission denied
// Ошибки конфигурации
├─ invalidUrlValue // invalid apiUrl value - empty or null
├─ invalidRTokenValue // invalid resource token value - resource token is empty
├─ unsupportedSubscriptionType // unsupported subscription type
// Ошибки аутентификации
├─ jwtIsNil // JWT token is nil
├─ jwtParsingError // JWT parsing error
// Успешные / неудачные API-запросы
├─ authenticateSuccessful // successful request: profile/authenticate
└─ authenticateFailed // failed request: profile/authenticate
class AltcraftConfiguration
AltcraftConfiguration
// Класс конфигурации Altcraft SDK: URL API, ресурсный токен, сведения о
// приложении, флаг логов и конфигурации опциональных модулей.
// Создаётся только через Builder. ObjC-совместим:
// AltcraftConfiguration / AltcraftConfiguration_Builder.
├─ @objc(AltcraftConfiguration_Builder) public final class Builder
│ // Задать API URL (обязательный параметр)
│ ├─ @discardableResult func setApiUrl(_ url: String) -> Builder
│ // Задать ресурсный токен (опционально)
│ ├─ @discardableResult func setRToken(_ rToken: String?) -> Builder
│ // Задать метаданные приложения (Swift-модель AppInfo) (опциональн о)
│ ├─ @discardableResult func setAppInfo(_ info: AppInfo?) -> Builder
│ // Включить/выключить ведение логов (опционально)
│ ├─ @discardableResult func setEnableLogging(_ enabled: Bool?) -> Builder
│ // Добавить конфигурацию опционального модуля (повторный вызов для того же
│ // модуля заменяет предыдущую конфигурацию)
│ ├─ @discardableResult func addModuleConfiguration(
│ │ _ configuration: any ModuleConfiguration
│ │ ) -> Builder
│ // Построить валидную конфигурацию (nil, если валидация не пройдена)
│ └─ func build() -> AltcraftConfiguration?
// Доступ к параметрам конфигурации
├─ func getApiUrl() -> String
├─ func getRToken() -> String?
├─ func getAppInfo() -> AppInfo?
└─ func getEnableLogging() -> Bool?
Push (опциональный модуль)
enum Push
Push
// Доступ к API push-токенов
├─ var token: TokenAPI
// Доступ к API push-подписок и статусов
├─ var subscription: SubscriptionAPI
// Доступ к событиям push (доставка, открытие)
├─ var event: EventAPI
// Доступ к приёму и обработке push-уведомлений
├─ var notificationManager: NotificationManager
// Типы событий Push-модуля
└─ var moduleEvents: PushModuleEvents.Type
class AltcraftNSE — обработка push в Notification Service Extension
// Используется внутри Notification Service Extension (NSE) — отвечает за обработку
// push-уведомлений Altcraft, определение уведомлений Altcraft и регистрацию целей
// без зависимости от UIApplication
AltcraftNSE
// Общий (singleton) экземпляр для централизованной логики NSE
├─ static let shared: AltcraftNSE
// Доступ к API регистрации целей
├─ let target: TargetAPI
// Доступ к API обновления полей профиля
├─ let profile: UpdateAPI
// Проверка, относится ли уведомление к Altcraft
├─ func isAltcraftPush(_ request: UNNotificationRequest) -> Bool
// Обработка входящего уведомления Altcraft: передача изменённого содержимого в contentHandler
├─ func handleNotificationRequest(
│ request: UNNotificationRequest,
│ contentHandler: @escaping (UNNotificationContent) -> Void
│ ): Void
// Вызывается системой при истечении времени работы NSE
├─ func serviceExtensionTimeWillExpire(): Void
// Установка App Group и инициализация общего контейнера данных
├─ func setAppGroup(groupName: String?): Void
// Регистрация JWT-провайдера
└─ func setJWTProvider(provider: JWTInterface): Void
class TokenAPI
TokenAPI
// Зарегистрировать провайдера Apple Push Notification service (nil — снять)
├─ func setAPNSTokenProvider(_ provider: APNSInterface?): Void
// Зарегистрировать провайдера Firebase Cloud Messaging (nil — снять)
├─ func setFCMTokenProvider(_ provider: FCMInterface?): Void
// Зарегистрировать провайдера Huawei Mobile Services (nil — снять)
├─ func setHMSTokenProvider(_ provider: HMSInterface?): Void
// Получить текущий токен устройства (completion опционален)
├─ func getPushToken(completion: ((TokenData?) -> Void)? = nil): Void
// Сохранить токен провайдера вручную
├─ func setPushToken(provider: String, pushToken: Any?): Void
// Изменить приоритет провайдеров и обновить токен
├─ func changePushPriorityList(_ list: [String]): Void
// Удалить токен выбранного провайдера
├─ func deleteDeviceToken(provider: String, completion: (() -> Void)? = nil): Void
// Форс-обновление токена (удалить —> обновить)
└─ func forcedTokenUpdate(completion: (() -> Void)? = nil): Void
class SubscriptionAPI
SubscriptionAPI
// Подписка на push-уведомление (status = SUBSCRIBED)
├─ func pushSubscribe(
│ sync: Bool = true,
│ profileFields: [String: Any?]? = nil,
│ customFields: [String: Any?]? = nil,
│ cats: [CategoryData]? = nil,
│ replace: Bool? = nil,
│ skipTriggers: Bool? = nil
│ ): Void
// Приостановка подписки на push-уведомления (status = SUSPENDED)
├─ func pushSuspend(
│ sync: Bool = true,
│ profileFields: [String: Any?]? = nil,
│ customFields: [String: Any?]? = nil,
│ cats: [CategoryData]? = nil,
│ replace: Bool? = nil,
│ skipTriggers: Bool? = nil
│ ): Void
// Отписка от push-уведомлений (status = UNSUBSCRIBED)
├─ func pushUnSubscribe(
│ sync: Bool = true,
│ profileFields: [String: Any?]? = nil,
│ customFields: [String: Any?]? = nil,
│ cats: [CategoryData]? = nil,
│ replace: Bool? = nil,
│ skipTriggers: Bool? = nil
│ ): Void
// Смена статуса подписки указанной в JWT с suspended на subscribed, остальные
// подписки, содержащие указанный push-токен, сменят статус с subscribed на suspended
├─ func unSuspendPushSubscription(
│ completion: @escaping (ResponseWithHttpCode<ResponseWithProfile>?) -> Void
│ ): Void
// Статус последней подписки профиля
├─ func getStatusOfLatestSubscription(
│ completion: @escaping (ResponseWithHttpCode<ResponseWithProfile>?) -> Void
│ ): Void
// Статус подписки с текущим токеном устройства
├─ func getStatusForCurrentSubscription(
│ completion: @escaping (ResponseWithHttpCode<ResponseWithProfile>?) -> Void
│ ): Void
// Статус последней подписки профиля по указанному провайдеру push-уведомлений
├─ func getStatusOfLatestSubscriptionForProvider(
│ provider: String? = nil,
│ completion: @escaping (ResponseWithHttpCode<ResponseWithProfile>?) -> Void
│ ): Void
// Добавить функциональное поле профиля (set/incr/...)
└─ func actionField(key: String) -> ActionFieldBuilder
class EventAPI
EventAPI
// Зафиксировать доставку Altcraft-push (вызывает delivery-ивент)
├─ func deliveryEvent(from request: UNNotificationRequest): Void
// Зафиксировать открытие Altcraft-push (вызывает open-ивент)
└─ func openEvent(from request: UNNotificationRequest): Void
class NotificationManager
// Менеджер входящих push-уведомлений: регистрация, показ, обработка клика
NotificationManager
// Синглтон (точка доступа)
├─ static let shared: NotificationManager
// Регистрация на push (delegate + requestAuthorization + registerForRemoteNotifications)
├─ func registerForPushNotifications(
│ for application: UIApplication,
│ completion: ((_ granted: Bool, _ error: Error?) -> Void)? = nil
│ ): Void
// Управление обработкой push-уведомлений в foreground (true — приложению)
├─ var customPushProcessing: Bool
// Управление обработкой кликов по уведомлениям (true — приложению)
├─ var customClickProcessing: Bool
// Колбэк для кастомной обработки уведомления в foreground
├─ var onForegroundNotification: (
│ (UNNotification, @escaping (UNNotificationPresentationOptions) -> Void) -> Void
│ )?
// Колбэк для кастомной обработки клика по уведомлению
├─ var onNotificationClick: (
│ (UNNotificationResponse, @escaping () -> Void) -> Void
│ )?
// События NotificationCenter, публикуемые SDK
├─ Notification.Name.altcraftPushWillPresent // уведомление показывается в foreground
└─ Notification.Name.altcraftPushDidReceive // нажатие на уведомление / action
class PushConfiguration
// Конфигурация push-модуля. Добавляется в Builder вызовом pushConfig().
└─ class PushConfiguration(
icon: String? = nil, // Имя кастомной иконки уведомлений (опционально)
providerPriority: [String] = [], // Приоритет провайдеров push-уведомлений (опционально)
pushReceiverModules: [String] = [], // Префиксы пакетов с кастомными receivers (опционально)
pushChannelName: String? = nil, // Имя канала push-уведомлений (опционально)
pushChannelDescription: String? = nil // Описание канала push-уведомлений (опционально)
)
// Расширение для добавления конфигурации Push в главный билдер
└─ func AltcraftConfiguration.Builder.pushConfig(_ configuration: PushConfiguration) -> Self
Target (опциональный модуль)
enum Target
Target
// Доступ к API регистрации целей
├─ var event: TargetAPI
// Типы событий Target-модуля
└─ var moduleEvents: TargetModuleEvents.Type
class TargetAPI
TargetAPI
// Отправить цель (target-событие) на сервер
└─ func mobileEvent(
sid: String,
altcraftClientID: String = "",
eventName: String,
sendMessageId: String? = nil,
payload: [String: Any?]? = nil,
matching: [String: Any?]? = nil,
matchingType: String? = nil,
profileFields: [String: Any?]? = nil,
subscription: (any Subscription)? = nil,
utm: UTM? = nil
): Void
Profile (опциональный модуль)
enum Profile
Profile
// Доступ к API обновления полей профиля
├─ var update: UpdateAPI
// Типы событий Profile-модуля
└─ var moduleEvents: ProfileModuleEvents.Type
class UpdateAPI
UpdateAPI
// Обновить поля профиля
└─ func updateProfileFields(
profileFields: [String: Any?]? = nil,
skipTriggers: Bool? = nil
): Void
In-App (опциональный модуль)
enum InApp
InApp
// Подписка на жизненный цикл приложения для автоматического показа In-App
├─ func registerLifecycleTracking(): Void
// Установить маркер текущего экрана (используется при фильтрации In-App уведомлений)
├─ func setScreen(screen: String): Void
// Триггер кастомной In-App кампании по имени
├─ func trigger(name: String): Void
// Запрос доступных In-App placements
├─ func getPlacements(): Void
// Настроить анимацию In-App уведомления
├─ func setAnimation(
│ _ block: @escaping @MainActor (InAppAnimator) -> Void
│ ): Void
// Управление подписками на In-App уведомления
├─ var subscription: SubscribeAPI
// Типы событий In-App-модуля
└─ var moduleEvents: InAppModuleEvents.Type
class SubscribeAPI (In-App)
SubscribeAPI
// Подписка на In-App уведомления (status = SUBSCRIBED)
├─ func inAppSubscribe(
│ sync: Bool = true,
│ profileFields: [String: Any?]? = nil,
│ customFields: [String: Any?]? = nil,
│ cats: [CategoryData]? = nil,
│ replace: Bool? = nil,
│ skipTriggers: Bool? = nil
│ ): Void
// Отписка от In-App уведомлений (status = UNSUBSCRIBED)
├─ func inAppUnSubscribe(
│ sync: Bool = true,
│ profileFields: [String: Any?]? = nil,
│ customFields: [String: Any?]? = nil,
│ cats: [CategoryData]? = nil,
│ replace: Bool? = nil,
│ skipTriggers: Bool? = nil
│ ): Void
// Статус подписки на In-App уведомления
└─ func getInAppSubscriptionStatus(
completion: @escaping (ResponseWithHttpCode<ResponseWithProfile>?) -> Void
): Void
class InAppEmitter
// Вывод In-App кампаний с типом содержимого "json" для внешнего подписчика
InAppEmitter
// Синглтон
├─ static let shared: InAppEmitter
// Подписаться на JSON In-App кампаний (заменяет существующего подписчика)
├─ func subscribe(callback: @escaping (String) -> Void): Void
// Отписаться от JSON In-App кампаний
└─ func unsubscribe(): Void
protocol InAppAnimator
InAppAnimator
// Идентификатор размещения, к которому относится аниматор
├─ var companyId: Int { get }
// Применить блок к In-App view мгновенно, без запуска анимации
├─ @MainActor func prepare(_ block: (UIView) -> Void): Void
// Настроить и запустить UIKit-анимацию для In-App view
└─ @MainActor func animate(
duration: TimeInterval,
delay: TimeInterval,
options: UIView.AnimationOptions,
animations: @escaping (UIView) -> Void,
completion: ((Bool) -> Void)?
): Void
class InAppConfiguration
// Конфигурация In-App модуля. Добавляется в Builder вызовом inAppConfig().
└─ class InAppConfiguration(
inAppAutoRequest: Bool = true // Автоматический запрос In-App placements (опционально)
)
// Расширение для добавления конфигурации In-App в главный билдер
└─ func AltcraftConfiguration.Builder.inAppConfig(_ configuration: InAppConfiguration) -> Self
Модели данных
Event Classes
Event
// Базовое событие SDK (универсальная телеметрия)
public let id: UUID
public let function: String
public let event: SDKEvent?
public let message: String?
public let value: [String: Any]?
public let date: Date
ErrorEvent
// Ошибка SDK, наследует Event (ошибки без автоматического повтора)
RetryEvent
// Ошибка запроса, для которого предусмотрен автоматический повтор
// и выполнение на стороне SDK, наследует ErrorEvent
Data Classes (Core)
// Метаданные приложения для аналитики (если используется)
public struct AppInfo: Codable {
public var appID: String
public var appIID: String
public var appVer: String
}
// Обёртка ответа API вместе с HTTP-кодом
public struct ResponseWithHttpCode<T: ResponseData & Sendable> {
public let httpCode: Int?
public let response: T?
}
// Ответ запроса, содержащий данные профиля
public struct ResponseWithProfile: Codable {
public let error: Int?
public let errorText: String?
public let profile: ProfileData?
}
// Данные профиля пользователя
public struct ProfileData: Codable {
public let id: String?
public let status: String?
public let acid: String?
public let isTest: Bool?
public let subscription: SubscriptionData?
}
// Текущая подписка профиля
public struct SubscriptionData: Codable {
public let subscriptionId: String?
public let hashId: String?
public let provider: String?
public let status: String?
public let fields: [String: JSONValue]?
public let cats: [CategoryData]?
}
// Категория подписки (имя, заголовок, флаги)
public struct CategoryData: Codable {
public var name: String?
public var title: String?
public var steady: Bool?
public var active: Bool?
}
Data Classes (Push)
// Токен push-провайдера устройства
public struct TokenData: Codable {
public let provider: String
public let token: String
}
Data Classes (Target)
// Контейнер UTM-параметров для атрибуции целей (все поля опциональны)
public struct UTM: Codable {
public let campaign: String?
public let content: String?
public let keyword: String?
public let medium: String?
public let source: String?
public let temp: String?
}
// Базовый протокол всех типов подписок, добавляемых целью
public protocol Subscription {}
// Подписка на канал Email
public struct EmailSubscription: Subscription, Codable {
public let resourceId: Int
public let email: String
public let status: String?
public let priority: Int?
public let customFields: [String: JSONValue]?
public let cats: [String]?
public let channel: String = "email"
}
// Подписка на канал SMS
public struct SmsSubscription: Subscription, Codable {
public let resourceId: Int
public let phone: String
public let status: String?
public let priority: Int?
public let customFields: [String: JSONValue]?
public let cats: [String]?
public let channel: String = "sms"
}
// Подписка на push-канал
public struct PushSubscription: Subscription, Codable {
public let resourceId: Int
public let provider: String
public let subscriptionId: String
public let status: String?
public let priority: Int?
public let customFields: [String: JSONValue]?
public let cats: [String]?
public let channel: String = "push"
}
// Подписка с cc_data (Telegram, WhatsApp, Viber, Notify)
public struct CcDataSubscription: Subscription, Codable {
public let resourceId: Int
public let channel: String
public let ccData: [String: JSONValue]
public let status: String?
public let priority: Int?
public let customFields: [String: JSONValue]?
public let cats: [String]?
}
// Построитель функциональных операций (set/unset/incr/add/delete/upsert) над
// полем профиля. Результат — запись для словаря profileFields.
public struct ActionFieldBuilder {
public init(key: String)
public func set(value: Any?) -> [String: Any?]
public func unset(value: Any?) -> [String: Any?]
public func incr(value: Any?) -> [String: Any?]
public func add(value: Any?) -> [String: Any?]
public func delete(value: Any?) -> [String: Any?]
public func upsert(value: Any?) -> [String: Any?]
}
Constants
// Константы push-модуля
└─ enum PushConstants
// Провайдеры push-уведомлений
├─ enum ProviderName
│ ├─ static let apns = "ios-apns"
│ ├─ static let firebase = "ios-firebase"
│ └─ static let huawei = "ios-huawei"
// Типы событий push_event
├─ enum PushEvents
│ ├─ static let delivery = "delivery"
│ └─ static let open = "open"
Interfaces
JWTInterface (Core):
JWTInterface
// Доступ к текущему JWT
└─ func getToken() -> String?
// Возвращает текущий JWT или nil
APNSInterface (Push):
APNSInterface
// Контракт получения APNs-токена
└─ func getToken(completion: @escaping (String?) -> Void)
// Возвращает APNs-токен через completion или nil
FCMInterface (Push):
FCMInterface
// Контракт операций с FCM-токеном (получение/отзыв)
├─ func getToken(completion: @escaping (String?) -> Void)
│ // Возвращает FCM-токен через completion или nil
└─ func deleteToken(completion: @escaping (Bool) -> Void)
// Удаляет FCM-токен; completion(true|false)
HMSInterface (Push):
HMSInterface
// Контракт операций с HMS-токеном
├─ func getToken(completion: @escaping (String?) -> Void)
│ // Возвращает HMS-токен через completion или nil
└─ func deleteToken(completion: @escaping (Bool) -> Void)
// Удаляет HMS-токен; completion(true|false)
Subscription (Target):
Subscription (protocol)
// Базовый протокол для всех типов подписок, передаваемых с целью.
// Полиморфная сериализация, поле-дискриминатор — channel.