Функционал SDK
Предварительно вам необходимо настроить SDK для работы с вашим приложением. Подробная инструкция находится здесь
Получение событий SDK в приложении
// Object Events functions
AltcraftSDK
// Singleton, the entry point to the SDK
└── static let shared: AltcraftSDK
// SDK event stream (one active subscriber)
└── eventSDKFunctions: SDKEvents
// Subscribe to SDK events (replaces the existing subscriber)
├── subscribe(
│ callback: @escaping (Event) -> Void
│ ): Void
// Unsubscribe from events (the callback remains assigned, delivery stops)
└── unsubscribe(): Void
В приложении может быть только один активный подписчик на события SDK.
Подписка на события
public func subscribe(callback: @escaping (Event) -> Void): Void
Функция используется для того, чтобы подписаться и получать события SDK в приложении. При возникновении события SDK она вызывает callback
и передаёт в него экземпляр класса Event
(или его наследника).
Пример использования:
AltcraftSDK.shared.eventSDKFunctions.subscribe { event in
// event
}
Все события, передаваемые SDK, являются экземплярами Event
или его наследников:
- Event — общее событие (информация, успешные запросы);
- Error — событие об ошибке;
- RetryError — событие об ошибке при выполнения запроса для которого предусмотрен автоматический повтор выполнения на стороне SDK.
Каждое событие содержит поля:
- function — имя функции, вызывавшей событие;
- eventCode — внутренний код события SDK (список событий SDK представлен в пункте "События SDK");
- eventMessage — сообщение события;
- eventValue — произвольные данные [String: Any?]? которые добавляются к некоторым событиям как полезная нагрузка;
- date — время события.
События SDK
open class Event: Hashable {
public let id = UUID()
public let function: String
public let message: String?
public let eventCode: Int?
public let value: [String: Any?]?
public let date: Date
}
open class ErrorEvent: Event {
public override init(
function: String,
message: String? = nil,
eventCode: Int? = nil,
value: [String: Any?]? = nil,
date: Date = Date()
) {
super.init(
function: function,
message: message,
eventCode: eventCode,
value: value,
date: date
)
}
}
public class RetryEvent: ErrorEvent {
public override init(
function: String,
message: String? = nil,
eventCode: Int? = 0,
value: [String: Any?]? = nil,
date: Date = Date()
) {
super.init(
function: function,
message: message,
eventCode: eventCode,
value: value,
date: date
)
}
}
Пример содержания события успешной подписки на push-уведомления
├─ function: processResponse
├─ eventCode: 230
├─ message: "successful request: push/subscribe"
├─ value
│ ├─ http code: 200
│ └─ response
│ ├─ error: 0
│ ├─ errorText: ""
│ └─ profile
│ ├─ id: // profile ID
│ ├─ status: subscribed
│ ├─ isTest: false
│ └─ subscription
│ ├─ subscriptionId: // subscription push token
│ ├─ hashId: // ID hash
│ ├─ provider: "ios-apns"
│ ├─ status: subscribed
│ ├─ fields
│ │ ├─ _ad_id: // google service ad id
│ │ ├─ _ad_track: false
│ │ ├─ _app_id: "AltcraftMobile"
│ │ ├─ _app_iid: "1.0.0"
│ │ ├─ _app_ver: {"raw":"1.0.0","ver":[1,0]}
│ │ ├─ _device_model: "iPhone14,7"
│ │ ├─ _device_name: "iPhone"
│ │ ├─ _device_type: "mob"
│ │ ├─ _os: "Android"
│ │ ├─ _os_language: "ru"
│ │ ├─ _os_tz: "+0300"
│ │ └─ _os_ver: {"raw":"18.6.2","ver":"[\"18.0\", \"6.0\", \"2.0\"]"}
│ └─ cats
│ └─ [ { name: "cats_1", title: "cats_1", steady: false, active: false } ]
└─ date: Tue Aug 12 15:49:20 GMT+03:00 2025
Отписка от событий
public func unsubscribe(): Void
При помощи данной функции можно отписаться от событий SDK. Она отменяет передачу событий SDK, при этом callback
остаётся назначенны м, но доставка событий прекращается.
Пример использования:
//unsubscribe from getting SDK events
AltcraftSDK.shared.eventSDKFunctions.unsubscribe()
Работа со статусами подписки
Запрос статуса подписки
AltcraftSDK
// Singleton, the entry point to the SDK
└── static let shared: AltcraftSDK
// Subscription managment
└── pushSubscriptionFunctions: PublicPushSubscriptionFunctions
// Last profile subscription status
├── getStatusOfLatestSubscription(
│ completion: @escaping (ResponseWithHttp?) -> Void
│ ): Void
// Subscription status corresponding to the current token/provider
├── getStatusForCurrentSubscription(
│ completion: @escaping (ResponseWithHttp?) -> Void
│ ): Void
// Status of the latest subscription for the provider (if nil — the current one is used)
└── getStatusOfLatestSubscriptionForProvider(
provider: String? = nil,
completion: @escaping (ResponseWithHttp?) -> Void
): Void
Функции запроса статуса подписки:
func getStatusOfLatestSubscription()
— статус последней подписки профиля;func getStatusOfLatestSubscriptionForProvider()
— статус подписки для текущего токена/провайдера;func getStatusForCurrentSubscription()
— статус последней подписки по провайдеру. Если указанnil
, то используется текущий.
public func getStatusOfLatestSubscription(completion: @escaping (ResponseWithHttp?) -> Void): Void
Функция получения статуса последней подписки профиля. В completion
передаётся объект ResponseWithHttp?
, содержащий response?.profile?.subscription
— последнюю созданную подписку в профиле. Если такой подписки не существует, будет передан nil
.
Пример использования:
// Last profile subscription status
AltcraftSDK.shared.pushSubscriptionFunctions.getStatusOfLatestSubscription(completion: @escaping (ResponseWithHttp?) -> Void)
public func getStatusForCurrentSubscription(completion: @escaping (ResponseWithHttp?) -> Void): Void
Функция получения статуса подписки для текущего токена/провайдера. В completion
передаётся объект ResponseWithHttp?
, содержащий response?.profile?.subscription
— подписку, найденную по текущему push-токену и провайдеру. Если такой подписки не существует, будет передан nil
.
Пример использования:
// Subscription status corresponding to the current token/provider
AltcraftSDK.shared.pushSubscriptionFunctions.getStatusForCurrentSubscription(completion: @escaping (ResponseWithHttp?) -> Void)
public func getStatusOfLatestSubscriptionForProvider(provider: String? = nil, completion: @escaping (ResponseWithHttp?) -> Void): Void
Функция получения статуса последней подписки по провайдеру. В completion
передаётся объект ResponseWithHttp?
, содержащий response?.profile?.subscription
— последнюю созданную подписку с указанным провайдером push-уведомлений. Если провайдер не указан, используется провайдер текущего токена. Если такой подписки не существует, будет передан nil
.
Пример использования:
// Status of the latest subscription for the provider (if nil — the current one is used)
AltcraftSDK.shared.pushSubscriptionFunctions.getStatusOfLatestSubscriptionForProvider(provider: String? = nil, completion: @escaping (ResponseWithHttp?) -> Void)
Ниже представлен пример извлечения данных о профиле, подписке и категориях из ответа функций получения статуса. Данный подход актуален для всех функций получения статуса:
Данные из функций получения статуса
AltcraftSDK.shared.pushSubscriptionFunctions.getStatusForCurrentSubscription{ responseWithHttp in
// HTTP code
let httpCode = responseWithHttp?.httpCode
// Response
let response = responseWithHttp?.response
let error = response?.error
let errorText = response?.errorText
// Profile
let profile = response?.profile
let profileId = profile?.id
let profileStatus = profile?.status
let profileIsTest = profile?.isTest
// Subscription
let subscription = profile?.subscription
let subscriptionId = subscription?.subscriptionId
let hashId = subscription?.hashId
let provider = subscription?.provider
let subscriptionStatus = subscription?.status
// Fields (dictionary [String: JSONValue])
let fields = subscription?.fields
// Cats (array of CategoryData)
let cats = subscription?.cats
// CategoryData (every element of cats array)
let firstCat = cats?.first
let catName = firstCat?.name
let catTitle = firstCat?.title
let catSteady = firstCat?.steady
let catActive = firstCat?.active
}
В случае успешно выполненного запроса будет создано событие с кодом 234. В случае ошибки — событие с кодом 434.
Изменение статуса подписки
AltcraftSDK
// Singleton, the entry point to the SDK
└── static let shared: AltcraftSDK
// Push subscription managment
└── pushSubscriptionFunctions: PublicPushSubscriptionFunctions
// Subscribe (status = SUBSCRIBED)
├── pushSubscribe(
│ sync: Bool = true,
│ profileFields: [String: Any?]? = nil,
│ customFields: [String: Any?]? = nil,
│ cats: [CategoryData]? = nil,
│ replace: Bool? = nil,
│ skipTriggers: Bool? = nil
│ ): Void
// Unsubscribe (status = UNSUBSCRIBED)
├── pushUnSubscribe(
│ sync: Bool = true,
│ profileFields: [String: Any?]? = nil,
│ customFields: [String: Any?]? = nil,
│ cats: [CategoryData]? = nil,
│ replace: Bool? = nil,
│ skipTriggers: Bool? = nil
│ ): Void
// Suspend (status = SUSPENDED)
└── pushSuspend(
sync: Bool = true,
profileFields: [String: Any?]? = nil,
customFields: [String: Any?]? = nil,
cats: [CategoryData]? = nil,
replace: Bool? = nil,
skipTriggers: Bool? = nil
): Void
Функции изменения статуса подписки:
func pushSubscribe()
— выполняет подписку на push-уведомления;func pushUnSubscribe()
— отменяет подписку на push-уведомления;func pushSuspend()
— приостанавливает подписку на push-уведомления (уведомления не приходят, но при этом не создается событие отписки в профиле пользователя);func unSuspendPushSubscription()
— используется для созданияLogIn
-,LogOut
-переходов.
Функции этой группы имеют одинаковую сигнатуру, содержащую следующие параметры:
sync: Bool
По умолчанию: true
Обязательный: Нет
Описание: Флаг, устанавливающий синхронность выполнения запроса.
Успешное выполнение запроса:
В случае успешного выполнения запроса данной группы функций будет создано событие с кодом 230, содержащее значение event.value
, определяемое в зависимости от флага синхронизации:
Если sync == true
ResponseWithHttpCode
├─ httpCode: 200
└─ response
├─ error: 0
├─ errorText: ""
└─ profile
├─ id: "your id"
├─ status: "subscribed"
├─ isTest: false
└─ subscription
├─ subscriptionId: "your subscriptionId"
├─ hashId: "c52b28d2"
├─ provider: "ios-apns"
├─ status: "subscribed"
├─ fields
│ ├─ _os_ver: {"raw":"18.6.2","ver":"[\"18.0\", \"6.0\", \"2.0\"]"}
│ ├─ _device_type: "Mobile"
│ ├─ _ad_track: false
│ ├─ _device_name: "iPhone"
│ ├─ _os_language: "en"
│ ├─ _os_tz: "+0300"
│ ├─ _os: "IOS"
│ └─ _device_model: "iPhone14,7"
└─ cats
└─ [ { name: "developer_news", title: "dev_news", steady: false, active: false } ]
При синхронном запросе в значении события event.value
по ключу "response_with_http_code"
доступны:
-
httpCode – транспортный код ответа;
-
Response – public struct, содержащий:
-
error: Int?
— внутренний код ошибки сервера (0, если ошибок нет), -
errorText: String?
— текст ошибки (пустая строка, если ошибок нет), -
profile: ProfileData?
— данные профиля, если запрос успешный:- информация о профиле (ProfileData)
- подписка (SubscriptionData)
- категории подписки (CategoryData)
- если запрос завершился с ошибкой, то вернется только
profile = nil
-
Структуры данных
public struct Response {
let error: Int? // internal error code
let errorText: String? // error text
let profile: ProfileData?
}
public struct ProfileData {
let subscription: SubscriptionData?
let cats: [CategoryData]?
}
public struct SubscriptionData {
// Subscription Data
}
public struct CategoryData {
// Subscription Category Data
}
Если sync == false
ResponseWithHttpCode
├─ httpCode: Int?
└─ response: Response?
├─ error: Int?
├─ errorText: String?
└─ profile: ProfileData? = nil
При асинхронном запросе в значении события event.value
по ключу "response_with_http_code"
доступны:
-
httpCode – транспортный код ответа;
-
Response – public struct, содержащий:
error: Int?
— внутренний код ошибки сервера (0, если ошибок нет),errorText: String?
— текст ошибки (пустая строка, если ошибок нет),profile: ProfileData?
— данные профиля, для асинхронного запроса всегда равенnil
.
Выполнение запроса с ошибкой:
Если запрос данной группы функций завершился ошибкой, будет создано событие со следующими кодами:
- 430 – ошибка без автоматического повтора на стороне SDK;
- 530 – ошибка с автоматическим повтором на стороне SDK.
Содержимое события:
- только
httpCode
, если сервер Altcraft был недоступен; error
иerrorText
, если сервер вернул ошибку.
Получение значений событий push
AltcraftSDK.shared.eventSDKFunctions.subscribe { event in
if event.eventCode == 230 {
if let responseWithHttp = event.value?["response_with_http_code"] as? ResponseWithHttp {
// HTTP code
let httpCode = responseWithHttp.httpCode
// Response
let response = responseWithHttp.response
let error = response?.error
let errorText = response?.errorText
// Profile
let profile = response?.profile
let profileId = profile?.id
let profileStatus = profile?.status
let profileIsTest = profile?.isTest
// Subscription
let subscription = profile?.subscription
let subscriptionId = subscription?.subscriptionId
let hashId = subscription?.hashId
let provider = subscription?.provider
let subscriptionStatus = subscription?.status
// Fields (dictionary [String: JSONValue])
let fields = subscription?.fields
// Cats (array of CategoryData)
let cats = subscription?.cats
// CategoryData (every element of cats array)
let firstCat = cats?.first
let catName = firstCat?.name
let catTitle = firstCat?.title
let catSteady = firstCat?.steady
let catActive = firstCat?.active
}
}
}
Поля fields
, содержащиеся в subscription
могут содержать ваши пользовательские поля подписки. Они имеют тип [String: JSONValue]?
. public enum JSONValue
содержит вспомогательные функции позволяющие упростить получение значений fields:
public var stringValue: String? {
if case let .string(value) = self { return value }
return nil
}
/// Returns the numeric value if case is `.number`, otherwise `nil`.
public var numberValue: Double? {
if case let .number(value) = self { return value }
return nil
}
/// Returns the bool value if case is `.bool`, otherwise `nil`.
public var boolValue: Bool? {
if case let .bool(value) = self { return value }
return nil
}
/// Returns the object dictionary if case is `.object`, otherwise `nil`.
public var objectValue: [String: JSONValue]? {
if case let .object(value) = self { return value }
return nil
}
/// Returns the array if case is `.array`, otherwise `nil`.
public var arrayValue: [JSONValue]? {
if case let .array(value) = self { return value }
return nil
}
Пример получения значения поля field "_device_name"
:
AltcraftSDK.shared.eventSDKFunctions.subscribe { event ->
if event.eventCode == 230 {
if let responseWithHttp = event.value?["response_with_http_code"] as? ResponseWithHttp {
let response = responseWithHttp.response
let profile = response?.profile
let subscription = profile?.subscription
// extract fields?["_device_name"] as a string value
if let deviceName = subscription?.fields?["_device_name"]?.stringValue {
print(deviceName)
}
}
}
}
profileFields:[String: Any?]?
По умолчанию: nil
Обязательный: Нет
Описание: Словарь, содержащий поля профиля.
Параметр может принимать как системные поля (например, _fname
— имя или _lname
— фамилия), так и опциональные (заранее создаются вручную в интерфейсе платформы). Допустимые типы значений (JSON-совместимые):
- String
- Bool
- Числа
nil
- Объекты
[String: Any]
- Массивы
Если передано невалидное опциональное поле, запрос завершится с ошибкой:
SDK error: 430
http code: 400
error: 400
errorText: Platform profile processing error: with field "название_поля": Incorrect field