Конфигурация SDK
Предварительные условия
- SDK провайдеров push-уведомлений интегрированы в проект приложения (см. инструкции по интеграции push-провайдеров).
- В приложении добавлен класс, расширяющий Application.
- В проекте должен быть подключён репозиторий Maven Central.
- Добавлены зависимости модулей SDK в файл
build.gradle.ktsуровня приложения (app level):
dependencies {
implementation("com.altcraft:android-sdk-core:X.Y.Z")
implementation("com.altcraft:android-sdk-push:X.Y.Z")
// при необходимости — другие модули:
// implementation("com.altcraft:android-sdk-target:X.Y.Z")
// implementation("com.altcraft:android-sdk-profile:X.Y.Z")
// implementation("com.altcraft:android-sdk-inapp:X.Y.Z")
}
Модуль активизируется добавлением его зависимости: каждый модуль регистрируется автоматически при запуске приложения, отдельная регистрация не требуется.
Подготовка приложения
Настройка JWT-интерфейса (опционально)
JWTInterface — интерфейс запроса JWT-токена. Предоставляет актуальный JWT-токен из приложения по запросу SDK. Реализация данного интерфейса требуется, если используется JWT-аутентификация API-запросов. JWT подтверждает, что пользовательские идентификаторы аутентифицированы приложением.
Реализация JWT-аутентификации обязательна, если используется тип матчинга отличный от push-данных из подписки (например, идентификатор пользователя — email или телефон).
Интерфейс SDK:
interface JWTInterface {
fun getJWT(): String?
}
Реализация на стороне приложения
import android.content.Context
import com.altcraft.sdk.platform.authenticate.external.jwt.JWTInterface
class JWTProvider(): JWTInterface {
override fun getJWT(): String? {
// код, возвращающий JWT-токен
}
}
Регистрация провайдера в Application.onCreate()
import android.app.Application
import com.altcraft.sdk.AltcraftSDK
class App : Application() {
override fun onCreate() {
super.onCreate()
AltcraftSDK.auth.setJWTProvider(JWTProvider(applicationContext))
}
}
getJWT() — синхронная функция. Поток выполнения SDK будет приостановлен до получения JWT. Рекомендуется, чтобы getJWT() возвращал значение немедленно — из кэша (in-memory, SharedPreferences или EncryptedSharedPreferences) — это ускорит выполнение запросов. Желательно подготовить актуальный JWT как можно раньше (на старте приложения) и сохранить его в кэш, чтобы при обращении SDK токен был доступен без задержек. При отсутствии значения допустимо вернуть null.
Подготовка к работе с push-провайдерами
Для предварительной подготовки приложения к работе в провайдерами push, необходимо:
- Интегрировать SDK push-провайдеров в проект;
- Реализовать интерфейсы SDK для передачи и удаления push-токена;
- Расширить сервисы push-провайдеров;
- Зарегистрировать сервис push-провайдера в
AndroidManifest.xml.
Firebase Cloud Messaging
Интеграция FCM SDK в проект
Статья по интеграции FCM доступна здесь.
Реализация интерфейса Altcraft SDK
FCMInterface — интерфейс запроса и удаления push-токена FCM:
- Передает токен FCM в SDK Altcraft
- Удаляет токен FCM по запросу SDK Altcraft
Интерфейс SDK:
interface FCMInterface {
suspend fun getToken(): String?
fun deleteToken(completion: (Boolean) -> Unit)
}
Рекомендуемая реализация на стороне приложения
import com.altcraft.sdk.push.platform.token.provider.FCMInterface
import com.google.firebase.Firebase
import com.google.firebase.messaging.FirebaseMessaging
import com.google.firebase.messaging.messaging
import kotlinx.coroutines.tasks.await
class FCMProvider : FCMInterface {
override suspend fun getToken(): String? = try {
Firebase.messaging.token.await()
} catch (_: Exception) {
null
}
override fun deleteToken(completion: (Boolean) -> Unit) {
try {
FirebaseMessaging.getInstance().deleteToken().addOnCompleteListener {
completion(it.isSuccessful)
}
} catch (_: Exception) {
completion(false)
}
}
}
Регистрация провайдера в Application.onCreate()
import android.app.Application
import com.altcraft.sdk.AltcraftSDK
import com.altcraft.sdk.push.push
class App : Application() {
override fun onCreate() {
super.onCreate()
AltcraftSDK.push.token.setFCMTokenProvider(FCMProvider())
}
}
Реализация сервиса провайдера
Рекомендуемая реализация FCMService с передачей уведомления в функцию takePush():
import com.altcraft.sdk.AltcraftSDK
import com.altcraft.sdk.push.push
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
/**
* FCM service for handling push tokens and messages.
*/
class FCMService : FirebaseMessagingService() {
/**
* Called when a new FCM token is generated.
*
* @param token The new FCM token.
*/
override fun onNewToken(token: String) {
super.onNewToken(token)
}
/**
* Called when a push message is received.
*
* @param message The received [RemoteMessage].
*/
override fun onMessageReceived(message: RemoteMessage) {
super.onMessageReceived(message)
AltcraftSDK.push.receiver.takePush(this@FCMService, message.data)
}
}
Регистрация сервиса push-провайдера в AndroidManifest.xml
<service
android:name="<your_package_name>.FCMService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
Huawei Mobile Services
Интеграция HMS SDK в проект
Статья по интеграции HMS доступна здесь.
Реализация интерфейса Altcraft SDK
HMSInterface — интерфейс запроса и удаления push-токена HMS.
Интерфейс SDK:
import android.content.Context
interface HMSInterface {
suspend fun getToken(context: Context): String?
fun deleteToken(context: Context, complete: (Boolean) -> Unit)
}
Рекомендуемая ре ализация на стороне приложения
import android.content.Context
import com.altcraft.sdk.push.platform.token.provider.HMSInterface
import com.huawei.agconnect.AGConnectOptionsBuilder
import com.huawei.hms.aaid.HmsInstanceId
import com.huawei.hms.api.HuaweiApiAvailability
private const val APP_ID = "client/app_id"
private const val TOKEN_SCOPE = "HCM"
class HMSProvider : HMSInterface {
override suspend fun getToken(context: Context): String? = try {
val availability = HuaweiApiAvailability.getInstance()
.isHuaweiMobileServicesAvailable(context)
if (availability != com.huawei.hms.api.ConnectionResult.SUCCESS) return null
val appId = AGConnectOptionsBuilder().build(context).getString(APP_ID)
HmsInstanceId.getInstance(context).getToken(appId, TOKEN_SCOPE)
} catch (e: Exception) {
null
}
override fun deleteToken(context: Context, complete: (Boolean) -> Unit) {
try {
val appId = AGConnectOptionsBuilder().build(context).getString(APP_ID)
HmsInstanceId.getInstance(context).deleteToken(appId, TOKEN_SCOPE)
complete(true)
} catch (e: Exception) {
complete(false)
}
}
}
Регистрация провайдера в Application.onCreate()
import android.app.Application
import com.altcraft.sdk.AltcraftSDK
import com.altcraft.sdk.push.push
class App : Application() {
override fun onCreate() {
super.onCreate()
AltcraftSDK.push.token.setHMSTokenProvider(HMSProvider())
}
}
Реализация сервиса провайдера
Рекомендуемая реализация HMSService с передачей уведомления в функцию takePush():
import com.altcraft.sdk.AltcraftSDK
import com.altcraft.sdk.push.push
import com.huawei.hms.push.HmsMessageService
import com.huawei.hms.push.RemoteMessage
/**
* HMS service for handling push tokens and incoming notifications.
*
* Extends [HmsMessageService] and overrides key HMS callback methods.
*/
class HMSService : HmsMessageService() {
/**
* Called when a new HMS token is generated.
*
* @param token The new HMS token.
*/
override fun onNewToken(token: String) {
super.onNewToken(token)
}
/**
* Called when a push message is received from HMS.
*
* Forwards the message with additional metadata to all receivers.
*
* @param message The received [RemoteMessage].
*/
override fun onMessageReceived(message: RemoteMessage) {
AltcraftSDK.push.receiver.takePush(this@HMSService, message.dataOfMap)
}
}
Регистрация сервиса push-провайдера в AndroidManifest.xml
<service
android:name="<your_package_name>.HMSService"
android:exported="false">
<intent-filter>
<action android:name="com.huawei.push.action.MESSAGING_EVENT" />
</intent-filter>
</service>
RuStore
Интеграция RuStore SDK в проект
Статья по интеграции RuStore доступна здесь.
Реализация интерфейса Altcraft SDK
RustoreInterface — интерфейс запроса и удаления push-токена RuStore.
Интерфейс SDK:
interface RustoreInterface {
suspend fun getToken(): String?
fun deleteToken(complete: (Boolean) -> Unit)
}
Рекомендуемая реализация на стороне приложения
import com.altcraft.sdk.push.platform.token.provider.RustoreInterface
import kotlinx.coroutines.CompletableDeferred
import ru.rustore.sdk.core.feature.model.FeatureAvailabilityResult
import ru.rustore.sdk.pushclient.RuStorePushClient
class RuStoreProvider : RustoreInterface {
override suspend fun getToken(): String? {
val deferred = CompletableDeferred<String?>()
try {
val token = RuStorePushClient.getToken().await()
RuStorePushClient.checkPushAvailability()
.addOnSuccessListener { result ->
when (result) {
FeatureAvailabilityResult.Available -> deferred.complete(token)
is FeatureAvailabilityResult.Unavailable -> deferred.complete(null)
}
}
.addOnFailureListener { deferred.complete(null) }
} catch (e: Exception) {
return null
}
return deferred.await()
}
override fun deleteToken(complete: (Boolean) -> Unit) {
try {
RuStorePushClient.deleteToken()
.addOnSuccessListener { complete(true) }
.addOnFailureListener { complete(false) }
} catch (e: Exception) {
complete(false)
}
}
}
Регистрация провайдера в Application.onCreate()
import android.app.Application
import com.altcraft.sdk.AltcraftSDK
import com.altcraft.sdk.push.push
class App : Application() {
override fun onCreate() {
super.onCreate()
AltcraftSDK.push.token.setRuStoreTokenProvider(RuStoreProvider())
}
}
Реализация сервиса провайдера
Рекомендуемая реализация RuStoreService с передачей уведомления в функцию takePush():
import com.altcraft.sdk.AltcraftSDK
import com.altcraft.sdk.push.push
import ru.rustore.sdk.pushclient.messaging.model.RemoteMessage
import ru.rustore.sdk.pushclient.messaging.service.RuStoreMessagingService
/**
* RuStore service for handling push notifications.
*
* Extends [RuStoreMessagingService] and overrides key callbacks.
*/
class RuStoreService : RuStoreMessagingService() {
override fun onNewToken(token: String) {
super.onNewToken(token)
}
/**
* Called when a push message is received.
*
* Forwards the message to all receivers with added metadata.
*
* @param message The received RemoteMessage.
*/
override fun onMessageReceived(message: RemoteMessage) {
AltcraftSDK.push.receiver.takePush(this, message.data)
}
}
Регистрация сервиса push-провайдера в AndroidManifest.xml
<service
android:name="<your_package_name>.RuStoreService"
android:exported="true"
tools:ignore="ExportedService">
<intent-filter>
<action android:name="ru.rustore.sdk.pushclient.MESSAGING_EVENT" />
</intent-filter>
</service>