Функционал SDK
Предварительно вам необходимо настроить SDK для работы с вашим приложением. Подробная инструкция находится здесь
Получение событий SDK в приложении
// Object Events functions
AltcraftSDK
└── val eventSDKFunctions: Events
// Subscribe to SDK events (replaces the existing subscriber)
├── fun subscribe(
│ newSubscriber: (DataClasses.Event) -> Unit
│ ): Unit
// Unsubscribe from events
└── fun unsubscribe(): Unit
В приложении может быть только один активный подписчик на события SDK.
Подписка на события
fun subscribe(newSubscriber: (DataClasses.Event) -> Unit): Unit
Функция используется для того, чтобы подписаться и получать события SDK в приложении. При возникновении события SDK она вызывает callback
и передаёт в него экземпляр класса Event
(или его наследника).
Пример использования:
AltcraftSDK.eventSDKFunctions.subscribe { event ->
// event handling
}
Все события, передаваемые SDK, являются экземплярами Event
или его наследников:
- Event — общее событие (информация, успешные запросы);
- Error — событие об ошибке;
- RetryError — событие об ошибке при выполнения запроса для которого предусмотрен автоматический повтор выполнения на стороне SDK.
Каждое событие содержит поля:
- function — имя функции, вызывавшей событие;
- eventCode — внутренний код события SDK (список событий SDK представлен в пункте "События SDK");
- eventMessage — сообщение события;
- eventValue — произвольные данные [String: Any?]? которые добавляются к некоторым событиям как полезная нагрузка;
- date — время события.
События SDK
open class Event(
val function: String,
val eventCode: Int? = null,
val eventMessage: String? = null,
val eventValue: Map<String, Any?>? = null,
val date: Date = Date(),
)
open class Error(
function: String,
eventCode: Int? = 0,
eventMessage: String? = null,
eventValue: Map<String, Any?>? = null,
date: Date = Date(),
) : Event(function, eventCode, eventMessage, eventValue, date)
class RetryError(
function: String,
eventCode: Int? = 0,
eventMessage: String? = null,
eventValue: Map<String, Any?>? = null,
date: Date = Date(),
) : Error(function, eventCode, eventMessage, eventValue, date)
Пример содержания события успешной подписки на push-уведомления
├─ function: processResponseprocessResponse
├─ eventCode: 230
├─ eventMessage: "successful request: push/subscribe"
├─ eventValue
│ ├─ http code: 200
│ └─ response
│ ├─ error: 0
│ ├─ errorText: ""
│ └─ profile
│ ├─ id: "your id"
│ ├─ status: "subscribed"
│ ├─ isTest: false
│ └─ subscription
│ ├─ subscriptionId: "your subscriptionId"
│ ├─ hashId: "c52b28d2"
│ ├─ provider: "android-firebase"
│ ├─ status: "subscribed"
│ ├─ fields
│ │ ├─ _device_name: "Pixel 7"
│ │ ├─ _device_model: "Google Pixel 7"
│ │ ├─ _os_tz: "+0300"
│ │ ├─ _os_language: "ru"
│ │ ├─ _os_ver: {"raw":"14","ver":[14]}
│ │ ├─ _ad_track: true
│ │ ├─ _os: "Android"
│ │ └─ _device_type: "Mobile"
│ └─ cats
│ └─ [ { name: "developer_news", title: "dev_news", steady: false, active: false } ]
└─ date: 2025-09-03 09:01:44 +0000
Отписка от событий
fun unsubscribe(): Unit
При помощи данной функции можно отписаться от событий SDK. Она отменяет передачу событий SDK, при этом callback
остаётся назначенным, но доставка событий прекращается.
Пример использования:
//unsubscribe from getting SDK events
AltcraftSDK.eventSDKFunctions.unsubscribe()
Работа со статусами подписки
Запрос статуса подписки
AltcraftSDK
└── val pushSubscriptionFunctions: PublicPushSubscriptionFunctions
// Статус последней подписки профиля
├── suspend fun getStatusOfLatestSubscription(
│ context: Context
│ ): DataClasses.ResponseWithHttpCode?
// Статус подписки по текущему токену/провайдеру
├── suspend fun getStatusForCurrentSubscription(
│ context: Context
│ ): DataClasses.ResponseWithHttpCode?
// Статус последней подписки по указанному провайдеру (если null — используется текущий)
└── suspend fun getStatusOfLatestSubscriptionForProvider(
context: Context,
provider: String? = null
): DataClasses.ResponseWithHttpCode?
Функции запроса статуса подписки:
fun getStatusOfLatestSubscription()
— статус последней подписки профиля;fun getStatusOfLatestSubscriptionForProvider()
— статус подписки для текущего токена/провайдера;fun getStatusForCurrentSubscription()
— статус последней подписки по провайдеру. Если указанnull
, то используется текущий.
suspend fun getStatusOfLatestSubscription(context: Context): DataClasses.ResponseWithHttpCode?
Функция получения статуса последней подписки профиля. Возвращает объект ResponseWithHttp?
, содержащий response?.profile?.subscription
— последнюю созданную подписку в профиле. Если такой подписки не существует, будет передан null
.
Пример использования:
// Last profile subscription status
AltcraftSDK.pushSubscriptionFunctions.getStatusOfLatestSubscription(context)
suspend fun getStatusForCurrentSubscription(context: Context): DataClasses.ResponseWithHttpCode?
Функция получения статуса подписки для текущего токена/провайдера. Возвращает объект ResponseWithHttp?
, содержащий response?.profile?.subscription
— подписку, найденную по текущему push-токену и провайдеру. Если такой подписки не существует, будет передан null
.
Пример использования:
// Subscription status corresponding to the current token/provider
AltcraftSDK.pushSubscriptionFunctions.getStatusForCurrentSubscription(context)
suspend fun getStatusOfLatestSubscriptionForProvider(context: Context, provider: String? = null): DataClasses.ResponseWithHttpCode?
Функция получения статуса последней подписки по провайдеру. Возвращает объект ResponseWithHttp?
, содержащий response?.profile?.subscription
— последнюю созданную подписку с указанным провайдером push-уведомлений. Если провайдер не указан (provider = null
), используется провайдер текущего токена. Если такой подписки не существует, будет передан null
.
// Status of the latest subscription for the provider (if null — the current one is used)
AltcraftSDK.pushSubscriptionFunctions.getStatusOfLatestSubscriptionForProvider(context, provider = null)
Ниже представлен пример извлечения данных о профиле, подписке и категориях из ответа функций получения статуса. Данный подход актуален для всех функций получения статуса:
Данные из функций получения статуса
CoroutineScope(Dispatchers.IO).launch {
AltcraftSDK.pushSubscriptionFunctions
.getStatusForCurrentSubscription(this@App)
?.let { it ->
val httpCode = it.httpCode
val response = it.response
val error = response?.error
val errorText = response?.errorText
val profile = response?.profile
val subscription = profile?.subscription
val cats = subscription?.cats
}
}
Изменение статуса подписки
AltcraftSDK
└─ val pushSubscriptionFunctions: PublicPushSubscriptionFunctions
// Subscribe (status = SUBSCRIBED)
├─ fun pushSubscribe(
│ context: Context,
│ sync: Boolean = true,
│ profileFields: Map<String, Any?>? = null,
│ customFields: Map<String, Any?>? = null,
│ cats: List<DataClasses.CategoryData>? = null,
│ replace: Boolean? = null,
│ skipTriggers: Boolean? = null
│ ): Unit
// Suspend (status = SUSPENDED)
├─ fun pushSuspend(
│ context: Context,
│ sync: Boolean = true,
│ profileFields: Map<String, Any?>? = null,
│ customFields: Map<String, Any?>? = null,
│ cats: List<DataClasses.CategoryData>? = null,
│ replace: Boolean? = null,
│ skipTriggers: Boolean? = null
│ ): Unit
// Unsubscribe (status = UNSUBSCRIBED)
└─ fun pushUnSubscribe(
context: Context,
sync: Boolean = true,
profileFields: Map<String, Any?>? = null,
customFields: Map<String, Any?>? = null,
cats: List<DataClasses.CategoryData>? = null,
replace: Boolean? = null,
skipTriggers: Boolean? = null
): Unit
Функции изменения статуса подписки:
fun pushSubscribe()
— выполняет подписку на push-уведомления;fun pushUnSubscribe()
— отменяет подписку на push-уведомления;fun pushSuspend()
— приостанавливает подписку на push-уведомления (уведомления не приходят, но при этом не создается событие отписки в профиле пользователя);fun unSuspendPushSubscription()
— используется для созданияLogIn
-,LogOut
-переходов.
Функции этой группы имеют одинаковую сигнатуру, содержащую следующие параметры:
context: Context
Обязательный: Да
Описание: Android Context.
sync: Boolean
По умолчанию: 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 = null
-
Структуры данных
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? = null
При асинхронном запросе в значении события event.value
по ключу "response_with_http_code"
доступны:
-
httpCode – транспортный код ответа;
-
Response – public struct, содержащий:
error: Int?
— внутренний код ошибки сервера (0, если ошибок нет),errorText: String?
— текст ошибки (пустая строка, если ошибок нет),profile: ProfileData?
— данные профиля, для асинхронного запроса всегда равенnull
.
Выполнение запроса с ошибкой:
Если запрос данной группы функций завершился ошибкой, будет создано событие со следующими кодами:
- 430 – ошибка без автоматического повтора на стороне SDK;
- 530 – ошибка с автоматическим повтором на стороне SDK.
Содержимое события:
- только
httpCode
, если сервер Altcraft был недоступен; error
иerrorText
, если сервер вернул ошибку.
Получение значений событий push
AltcraftSDK.eventSDKFunctions.subscribe { event ->
if (event.eventCode in listOf(230, 430, 530)) {
(event.eventValue?.get("response_with_http_code")
as? DataClasses.ResponseWithHttpCode)?.let { responseWithHttp ->
// HTTP code
val httpCode = responseWithHttp.httpCode
// Response
val response = responseWithHttp.response
val error = response?.error
val errorText = response?.errorText
// Profile
val profile = response?.profile
val profileId = profile?.id
val profileStatus = profile?.status
val profileIsTest = profile?.isTest
// Subscription
val subscription = profile?.subscription
val subscriptionId = subscription?.subscriptionId
val hashId = subscription?.hashId
val provider = subscription?.provider
val subscriptionStatus = subscription?.status
// Fields (Map<String, JsonElement>)
val fields = subscription?.fields
// Cats (List<CategoryData>)
val cats = subscription?.cats
val firstCat = cats?.firstOrNull()
val catName = firstCat?.name
val catTitle = firstCat?.title
val catSteady = firstCat?.steady
val catActive = firstCat?.active
}
}
}
profileFields:Map<String, Any?>?
По умолчанию: null
Обязательный: Нет
Описание: Словарь, содержащий поля профиля.
Параметр может принимать как системные поля (например, _fname
— имя или _lname
— фамилия), так и опциональные (заранее создаются вручную в интерфейсе платформы). Допустимые структуры (JSON-совместимые):
- Скалярные значения:
- String
- Boolean
- Int
- Long
- Float
- Double
null
- Объекты:
Map<String, *>
- Списки:
List<*>
- Массивы карт:
Array<Map<String, *>>
Если передано невалидное опциональное поле, запрос завершится с ошибкой:
SDK error: 430
http code: 400
error: 400
errorText: Platform profile processing error: with field "название_поля": Incorrect field
customFields:Map<String, Any?>?
По умолчанию: null
Обязательный: Нет
Описание: Словарь, содержащий поля подписки.
Параметр может принимать как системные поля (например, _device_model
— модель устройства или _os
— операционная система), так и опциональные (заранее создаются вручную в интерфейсе плат формы). Допустимые типы значений (JSON-совместимые, только скаляры):
- String
- Boolean
- Int
- Long
- Float
- Double
null
Если передано невалидное опциональное поле, запрос завершится с ошибкой:
SDK error: 430
http code: 400
error: 400
errorText: Platform profile processing error: field "название_поля" is not valid: failed convert custom field
Большая часть системных полей подписки автоматически собирается SDK и добавляется к push-запросам. К таким системным полям относятся: "_os"
, "_os_tz"
, "_os_language"
, "_device_type"
, "_device_model"
, "_device_name"
, "_os_ver"
, "_ad_track"
, "_ad_id"
.
cats:listOf(CategoryData)
По умолчанию: null
Обязательный: Нет
Описание: Категории подписок.
Структура категории:
data class CategoryData(
val name: String? = null,
val title: String? = null,
val steady: Boolean? = null,
val active: Boolean? = null
)
При отправке push-запроса с указанием категорий используйте только поля name
(название категории) и active
(статус активности категории), другие поля не используется в обработке запроса. Поля title
и steady
заполняются при получении информации о подписке.
Пример запроса:
val cats = listOf(
DataClasses.CategoryData(name = "football", active = true),
DataClasses.CategoryData(name = "hockey", active = true)
)
Категории используемые в запросе должны быть предварительно созданы и добавлены к ресурсу в платформе Altcraft. Если в запросе будет использовано поле, которое не добавлено в ресурс — запрос вернется с ошибкой:
SDK error: 430
http code: 400
error: 400
errorText: Platform profile processing error: field "subscriptions.cats" is not valid: category not found in resource
replace:Boolean?
По умолчанию: null
Обязательный: Нет
Описание: При активации флага все подписки других профилей с тем же push-токеном в текущей базе данных переводятся в статус unsubscribed
после успешного запроса.
skipTriggers:Boolean?
По умолчанию: null
Обязательный: Нет
Описание: При активации флага профиль, содержащий данную подписку, будет игнорироваться в триггерах кампаний и сценариев.
Примеры реализации запроса
Пример выполнения запроса подписки на push-уведомления
Минимальная рабочая настройка:
AltcraftSDK.pushSubscriptionFunctions.pushSubscribe(context)
Передача всех доступных параметров:
AltcraftSDK.pushSubscriptionFunctions.pushSubscribe(
context = this,
sync = true,
profileFields = mapOf("_fname" to "Andrey", "_lname" to "Pogodin"),
customFields = mapOf("developer" to true),
cats = listOf(DataClasses.CategoryData(name = "developer_news", active = true)),
replace = false,
skipTriggers = false
)
Для pushSubscribe
, pushSuspend
, pushUnSubscribe
предусмотрен автоматический повтор запроса со стороны SDK если http-код ответа находится в диапазоне 500..599. Запрос не повторяется, если код ответа в этот диапазон не входит.
Функция unSuspendPushSubscription()
Функция fun unSuspendPushSubscription()
предназначена для создания LogIn
-, LogOut
-переходов. Она работает следующим образом:
- проводит поиск подписок с тем же push-токеном, что и текущий, не относящихся к профилю, на который указывает текущий JWT-токен;
- меняет статус для найденных подписок с
subscribed
наsuspended
; - меняет статус в подписках профиля, на который указывает текущий JWT, с
suspended
наsubscribed
(если профиль на который указывает JWT существует и в нем содержатся подписки); - возвращает data class
ResponseWithHttpCode?
, в которомresponse.profile
— текущий профиль, на который указывает JWT (если профиля не существует, то вместоresponse.profile
вернетсяnull
).
Рекомендуемая реализация LogIn
-, LogOut
-переходов
LogIn
-переход:
- Анонимный пользователь входит в приложение. Данному пользователю присвоен
JWT_1
, указывающий на базу данных #1Anonymous; - Выполнена подписка на push-уведомления, профиль создан в базе данных #1Anonymous;
- Пользователь регистрируется, ему присваивается
JWT_2
, указывающий на базу данных #2Registered; - Вызывается функция
unSuspendPushSubscription()
— подписка анонимного пользователя в базе данных #1Anonymous приостанавливается; - Выполняется поиск профиля в базе данных #2Registered для восстановления подписки;
- Так как подписки с таким push-токеном в базе данных #2Registered не существует, функция
unSuspendPushSubscription()
вернетnull
; - После получения значения
null
можно выполнить запрос на подпискуpushSubscribe()
, который создаст новый профиль в базе #2Registered.
LogOut
-переход:
- Пользователь выполнил выход из профиля на стороне приложения (
LogOut
); - Пользователю присваивается
JTW_1
, указывающий на базу данных #1Anonymous; - Вызывается функция
unSuspendPushSubscription()
, которая приостановит подписку базе данных в #2Registered и сменит статус подписки в базе #1Anonymous наsubscribed
; - Запрос вернет
#1Anonymous != null
— подписка уже существует, новая не требуется.
Пример реализации:
private suspend fun unSuspend(context: Context, logIn: Boolean) {
// JWT change before request
setAuth(context, logIn)
AltcraftSDK.pushSubscriptionFunctions
.unSuspendPushSubscription(context)
?.let { result ->
if (result.httpCode == 200 && result.response?.profile?.subscription == null) {
AltcraftSDK.pushSubscriptionFunctions.pushSubscribe(
context = context
// specify the required parameters
)
}
}
}
fun logIn(context: Context) = CoroutineScope(Dispatchers.IO).launch { unSuspend(context, true) }
fun logOut(context: Context) = CoroutineScope(Dispatchers.IO).launch { unSuspend(context, false) }
Управление push-токенами провайдеров
AltcraftSDK
└── val pushTokenFunctions: PublicPushTokenFunctions
|
// Manually save the token (onNewToken)
├── fun setPushToken(context: Context, provider: String, token: String): Unit
|
// Get current device token data
├── suspend fun getPushToken(context: Context): DataClasses.TokenData?
|
// Set the Firebase Cloud Messaging provider (null — remove)
├── fun setFCMTokenProvider(provider: FCMInterface?): Unit
|
// Set the Huawei Mobile Services provider (null — remove)
├── fun setHMSTokenProvider(provider: HMSInterface?): Unit
|
// Set the RuStore provider (null — remove)
├── fun setRuStoreTokenProvider(provider: RustoreInterface?): Unit
|
// Delete the push token of the specified provider
├── suspend fun deleteDeviceToken(context: Context, provider: String, complete: () -> Unit): Unit
|
// Force token update (remove → update)
├── fun forcedTokenUpdate(context: Context, complete: () -> Unit): Unit
|
// Change a provider priority list and initiate token update
└── suspend fun changePushProviderPriorityList(context: Context, priorityList: List<String>): Unit
Функции для работы с токеном провайдера в SDK:
fun setPushToken()
— ручная установка push-токена устройства и провайдера вUserDefaults
;fun getPushToken()
— получение текущего push-токена;fun setFCMTokenProvider()
— установка и снятие push-токена FCM;fun setHMSTokenProvider()
— установка и снятие push-токена HSM;fun setRuStoreTokenProvider()
— установка и снятие push-токена RuStore;fun changePushProviderPriorityList()
— функция, позволяющая выполнить динамическую смену провайдера с обновлением push-токена подписки;fun deleteDeviceToken()
— удаление push-токена указанного провайдера;fun forcedTokenUpdate()
— удаление текущего push-токена с последующим обновлением.
fun setPushToken(context: Context, provider: String, token: String): Unit
Функция предназначена для ручной установки push-токена устройства и провайдера. Должна выполняться в функции onNewToken()
сервиса push-провайдера. Используется как упрощённый вариант передачи токена в SDK без реализации интерфейсов провайдеров.
Не рекомендуется использовать эту функцию для передачи токена. Рекомендуемый подход передачи push-токена в SDK — реализация FCMInterface
, HMSInterface
или APNSInterface
.
Пример использования:
// Manually save the token (onNewToken)
AltcraftSDK.pushTokenFunctions.setPushToken(context, provider, token)
Пример передачи токена в FCMService.onNewToken()
:
class FCMService : FirebaseMessagingService() {
override fun onNewToken(token: String) {
super.onNewToken(token)
// Manually pass new token
AltcraftSDK.pushTokenFunctions.setPushToken(this, FCM_PROVIDER, token)
}
override fun onDeletedMessages() {}
override fun onMessageReceived(message: RemoteMessage) {
super.onMessageReceived(message)
AltcraftSDK.PushReceiver.takePush(this@FCMService, message.data)
}
}
suspend fun getPushToken(context: Context): DataClasses.TokenData?
Функция возвращает текущие данные push-токена устройства и провайдера в виде data class TokenData(val provider: String, val token: String)
. Если токен недоступен — будет передано null
.
Пример использования:
// Get the current push token data
AltcraftSDK.pushTokenFunctions.getPushToken(context)
Пример запроса получения данных push-токена:
CoroutineScope(Dispatchers.IO).launch {
AltcraftSDK.pushTokenFunctions.getPushToken(context).let {
val provider = it?.provider
val token = it?.token
}
}
fun setFCMTokenProvider(provider: FCMInterface?): Unit
Функция устанавливает или снимает push-токен провайдера Firebase Cloud Messaging. Чтобы отключить провайдера, передайте null
.
Пример использования:
// Set the Firebase Cloud Messaging provider (null — remove)
AltcraftSDK.pushTokenFunctions.setFCMTokenProvider(FCMProvider())
Вызывайте setFCMTokenProvider()
в Application.onCreate()
до вызова AltcraftSDK.initialization()
. Это гарантирует регистрацию на старте процесса приложения, независимо от состояния жизненного цикла других компонентов и того, запущено приложение в foreground или background.
fun setHMSTokenProvider(provider: HMSInterface?): Unit
Функция устанавливает или снимает push-токен провайдера Huawei Mobile Services. Чтобы отключить провайдера, передайте null
.
Пример использования:
// Set the Huawei Mobile Services provider (null — remove)
AltcraftSDK.pushTokenFunctions.setHMSTokenProvider(HMSProvider())
Вызывайте setHMSTokenProvider()
в Application.onCreate()
до вызова AltcraftSDK.initialization()
. Это гарантирует регистрацию на старте процесса приложения, независимо от состояния жизненного цикла других компонентов и того, запущено приложение в foreground или background.
fun setRuStoreTokenProvider(provider: RustoreInterface?): Unit
Функция устанавливает или снимает push-токен провайдера RuStore. Чтобы отключить провайдера, передайте null
.
Пример использования:
// Set the RuStore provider (null — remove)
AltcraftSDK.pushTokenFunctions.setRustoreTokenProvider(RustoreProvider())
Вызывайте setRustoreTokenProvider()
в Application.onCreate()
до вызова AltcraftSDK.initialization()
. Это гарантирует регистрацию на старте процесса приложения, независимо от состояния жизненного цикла других компонентов и того, запущено приложение в foreground или background.
suspend fun changePushProviderPriorityList(context: Context, priorityList: List<String>): Unit
Функция, позволяющая выполнить динамическую смену push-провайдера с обновлением токена подписки. Для этого необходимо передать новый массив с другим порядком провайдеров. Например: listOf(HMS_PROVIDER, RUSTORE_PROVIDER, FCM_PROVIDER)
.
// Apply a new provider priority list and initiate token update
AltcraftSDK.pushTokenFunctions.changePushProviderPriorityList(context, listOf(HMS_PROVIDER, RUSTORE_PROVIDER, FCM_PROVIDER))
suspend fun deleteDeviceToken(context: Context, provider: String, complete: () -> Unit): Unit
Функция удаления push-токена указанного провайдера. Токен инвалидируется и удаляется из локального кеша на устройстве и с сервера push-провайдера. После удаления можно запросить новый токен.
// Delete the push token of the specified provider (invalidated locally and on the server)
AltcraftSDK.pushTokenFunctions.deleteDeviceToken(context, provider) {
// callback after removing
}
fun forcedTokenUpdate(context: Context, complete: () -> Unit): Unit
Функция удаления текущего push-токена с его последующим обновлением.
Пример использования:
// Force token update (delete → update)
AltcraftSDK.pushTokenFunctions.forcedTokenUpdate(context) {
// callback after removing
}
Пример регистрации провайдеров
Мы не рекомендуем использовать функцию setPushToken
для установки push-токена. Вместо этого отдельно настройте функции получения токена для каждого используемого провайдера. Ниже указан пример реализации этого метода:
Рекомендованный способ регистрации провайдеров
class App : Application() {
override fun onCreate() {
super.onCreate()
// set RuStore client
RuStorePushClient.init(this, "rustore project id")
// set JWT Provider
AltcraftSDK.setJWTProvider(JWTProvider(applicationContext))
// set FCM Provider
AltcraftSDK.pushTokenFunctions.setFCMTokenProvider(FCMProvider())
// set HMS Provider
AltcraftSDK.pushTokenFunctions.setHMSTokenProvider(HMSProvider())
// set RuStore Provider
AltcraftSDK.pushTokenFunctions.setRuStoreTokenProvider(RuStoreProvider())
// create AltcraftConfiguration
val config = AltcraftConfiguration.Builder(
apiUrl = "your api url",
R.drawable.ic_altcraft_label
).build()
// SDK Initialization
AltcraftSDK.initialization(context = this@App, configuration = config)
}
}
Передача push-уведомлений в SDK
PushReceiver
— публичный класс, в котором содержится функция, принимающая уведомления.
AltcraftSDK
└── open class PushReceiver
// Processing an incoming push message
├── open fun pushHandler(
│ context: Context,
│ message: Map<String, String>
│ ): Unit
// Entry point for push delivery into the SDK
└── companion object
└── fun takePush(
context: Context,
message: Map<String, String>
): Unit
Функции передачи push-уведомлений в SDK:
fun takePush()
— принимает уведомления в сервисе push-провайдеров для их дальнейшей обработки на стороне SDK;fun pushHandler()
— запускает стандартный механизм обработки push-уведомления Altcraft в SDK.
Прием уведомления
fun takePush(context: Context, message: Map<String, String>): Unit
Функция, принимающая push-уведомления для их да льнейшей обработки на стороне SDK.
Пример использования:
override fun onMessageReceived(message: RemoteMessage) {
super.onMessageReceived(message)
AltcraftSDK.PushReceiver.takePush(this@FCMService, message.data)
}
// message.data — message payload
Обработка уведомления
open fun pushHandler(context: Context, message: Map<String, String>): Unit
Функция запускает стандартный механизм обработки push-уведомления Altcraft в SDK.
Получение уведомлений в любом пакете приложения (опционально)
Для того чтобы получить уведомления в любом пакете приложения, выполните следующие действия:
Шаг 1. Создайте класс AltcraftPushReceiver
, расширяющий PushReceiver
. В этом классе будет переопределена функция pushHandler()
:
import android.content.Context
import androidx.annotation.Keep
import com.altcraft.sdk.AltcraftSDK
@Keep
class AltcraftPushReceiver : AltcraftSDK.PushReceiver() {
override fun pushHandler(context: Context, message: Map<String, String>) {
// standart push message handling and notification display
super.pushHandler(context, message)
}
}
Класс должен называться AltcraftPushReceiver. Если вы назовете его иначе, SDK не сможет его найти для передачи уведомления.
Шаг 2. В зависимости от ваших бизнес-целей, настройте логику работы класса AltcraftPushReceiver:
-
Если вы хотите, чтобы обработку и показ уведомлений выполнял SDK, то:
- используйте
super.pushHandler(context, message)
.
- используйте
-
Если вы хотите самостоятельно обрабатывать уведомления, то:
- не вызывайте функцию
super.pushHandler()
; - вручную регистрируйте события открытия с помощью функции
openEvent()
, иначе оно не зарегистрируется платформой Altcraft.
- не вызывайте функцию
События доставки "deliveryEvent" регистрируются автоматически. Создание AltcraftPushReceiver
классов на регистрацию этого события не влияет.
Если вы создали несколько классов AltcraftPushReceiver
, то вызов super.pushHandler()
в каждом из этих классов будет показывать сообщение пользователю. Чтобы избежать дубликации у ведомлений, вызывайте super.pushHandler()
только в одном классе.
Шаг 3. Добавьте имена пакетов, которые содержат классы AltcraftPushReceiver
, в параметр конфигурации pushReceiverModules
. После этого SDK автоматически определит наличие классов AltcraftPushReceiver
в указанных пакетах с помощью механизма рефлексии.
Если код приложения будет обфусцироваться, то класс должен быть помечен аннотацией @Keep
или добавлен в правила R8/ProGuard
, иначе SDK не сможет его обнаружить.
Пример добавления пакета в параметр pushReceiverModules
:
pushReceiverModules = listOf(
context.packageName, // application package
"com.altcraft.altcraftmobile.test"
)
Дополнительные функции SDK
Ручная регистрация push-событий
Эти функции применяются только в том случае, если вы реализуете собственную логику обработки уведомлений и не передаёте их в Altcraft SDK. По умолчанию Altcraft SDK обрабатывает уведомления автоматически, поэтому использование данных методов требуется лишь при необходимости кастомной обработки на стороне клиента.
// Функции объекта PublicPushEventFunctions
AltcraftSDK
└── val pushEventFunction: PublicPushEventFunctions
// Зафиксировать доставку Altcraft-push (вызывает delivery-ивент)
├── fun deliveryEvent(
│ context: Context,
│ message: Map<String, String>? = null,
│ uid: String? = null
│ ): Unit
// Зафиксировать открытие Altcraft-push (вызывает open-ивент)
└── fun openEvent(
context: Context,
message: Map<String, String>? = null,
uid: String? = null
): Unit
Функции ручной регистрации событий:
fun deliveryEvent()
— регистрация доставки уведомления;fun openEvent()
— регистрация открытия уведомления.
fun deliveryEvent(context: Context, message: Map\<String, String>? = null, uid: String? = null): Unit
Функция ручной регистрации события доставки уведомления в платформе Altcraft. Для регистрации события на сервере передайте в параметр message
или uid
полезные данные уведомления.
Пример использования:
// Зафиксировать доставку Altcraft-push (вызывает delivery-ивент)
AltcraftSDK.pushEventFunction.deliveryEvent(context, message, uid)
fun openEvent(context: Context, message: Map\<String, String>? = null, uid: String? = null): Unit
Функция ручной регистрации события открытия уведомления в платформе Altcraft. Для регистрации события на сервере передайте в параметр message
или uid
полезные данные уведомления.
Пример использования:
// Зафиксировать открытие Altcraft-push (вызывает open-ивент)
AltcraftSDK.pushEventFunction.openEvent(context, message, uid)
Очистка данных SDK
fun clear(context: Context, onComplete: (() -> Unit)? = null)
Функция позволяет выполнить очистку данных SDK и отменить работу всех фоновых задач, которые ожидают выполнения. Она выполняет отмену задач WorkManager
, удаляет записи БД Room
и очищает SharedPreferences
.
Пример использования:
AltcraftSDK
// Полная очистка данных SDK (БД, SharedPreferences, фоновые задачи)
└── fun clear(
context: Context,
onComplete: (() -> Unit)? = null
): Unit
Функция содержит необязательный параметр completion
, который вызывается после завершения очистки и отмены задач.