SDK Push-уведомления для Unreal Engine (версия 1.2.0)
Условия корректной работы SDK
Ниже перечислены условия работы push-уведомлений.
- Подпись и package name различных типов сборок вашего приложения (debug, release и т.д.) могут отличаться друг от друга. В таком случае вы должны создать в разделе Push-уведомления > Проекты из RuStore Консоль проект под каждый тип сборки..
- Используется актуальная версия SDK.
- Загружены данные о приложении в разделе Push-уведомления > Проекты из RuStore Консоль.
Приложение прошло модерацию (публиковать приложение необязательно).
.- На устройстве пользователя установлена актуальная версия RuStore.
- Приложение RuStore поддерживает функциональность push-уведомлений.
- Приложению RuStore разрешен доступ к работе в фоновом режиме.
- Пользователь авторизован в RuStore.
- Отпечаток подписи приложения, установленного на девайсе, совпадает с отпечатком подписи приложения, которое добавлено в разделе Push-уведомления > Проекты из RuStore Консоль.
- Версия Unreal Engine 4.26 или выше.
Пример реализации
Ознакомьтесь с приложением-примером, чтобы узнать, как правильно интегрировать SDK push-уведомлений.
Подключение в проект
- Скопируйте содержимое каталога
Pluginsиз официального репозитория RuStore на GitFlic в каталогPluginsвнутри своего проекта. - Перезапустите Unreal Engine.
- В списке плагинов (Edit > Plugins > Mobile) отметьте плагины RuStorePush и RuStoreCore.
- В файле
YourProject.Build.csв спискеPublicDependencyModuleNamesподключите модулиRuStoreCoreиRuStorePush. - В настройках проекта (Edit > Project Settings > Android) установите параметры:
- Minimum SDK Version — не ниже 24;
- Target SDK Version — не ниже 31.
Редактирование манифеста приложения
Плагин RuStorePush объявит службу RuStoreUnityMessagingService.
<service
android:name="ru.rustore.unitysdk.pushclient.RuStoreUnityMessagingService"
android:exported="true"
tools:ignore="ExportedService">
<intent-filter>
<action android:name="ru.rustore.sdk.pushclient.MESSAGING_EVENT" />
</intent-filter>
</service>
Если нужно изменить иконку или цвет стандартной нотификации, добавьте следующий код.
<meta-data
android:name="ru.rustore.sdk.pushclient.default_notification_icon"
android:resource="@drawable/ic_baseline_android_24" />
<meta-data
android:name="ru.rustore.sdk.pushclient.default_notification_color"
android:resource="@color/your_favorite_color" />
Если нужно переопределить канал уведомлений, добавьте следующий код.
<meta-data
android:name="ru.rustore.sdk.pushclient.default_notification_channel_id"
android:value="@string/pushes_notification_channel_id" />
При добавлении канала push-уведомлений вы должны создать канал самостоятельно.
Запрос разрешения на показ уведомлений в Android 13+
В версии Android 13 появилось новое разрешение для отображения push-уведомлений. Это затронет все приложения, которые работают на Android 13 или выше и используют RuStore Push SDK.
По умолчанию RuStore Push SDK версии 1.4.0 и выше включает разрешение POST_NOTIFICATIONS, определённое в манифесте.
Однако приложению также нужно запросить это разрешение во время выполнения через константу android.permission.POST_NOTIFICATIONS.
Приложение сможет показывать push-уведомления, только когда пользователь предоставит на это разрешение.
Запрос разрешения на показ push-уведомлений.
// Declare the launcher at the top of your Activity/Fragment:
private final ActivityResultLauncher<String> requestPermissionLauncher =
registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
if (isGranted) {
// RuStore Push SDK (and your app) can post notifications.
} else {
// TODO: Inform user that your app will not show notifications.
}
});
private void askNotificationPermission() {
// This is only necessary for API level>= 33 (TIRAMISU)
if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.TIRAMISU) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) ==
PackageManager.PERMISSION_GRANTED) {
// RuStore Push SDK (and your app) can post notifications.
} else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) {
// TODO: display an educational UI explaining to the user the features that will be enabled
// by them granting the POST_NOTIFICATION permission. This UI should provide the user
// "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission.
// If the user selects "No thanks," allow the user to continue without notifications.
} else {
// Directly ask for the permission
requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS);
}
}
}
Инициализация
Для инициализации понадобится идентификатор проекта из RuStore Консоль. Чтобы получить его, на странице приложения перейдите в раздел Push-уведомления > Проекты и скопируйте значение в поле ID проекта.
Обратите внимание, что Push SDK не поддерживает работу в нескольких процессах одновременно.
Если ваше приложение использует несколько процессов, необходимо инициализировать SDK только в главном процессе.
Если инициализация происходит в дополнительном процессе, это может привести к некорректной работе push-уведомлений.
Для доступа к методам push sdk из C++ выполните инициализацию плагина, используя метод Init.
FURuStorePushClientConfig config;
config.allowNativeErrorHandling = true;
config.messagingServiceListener = pushMessagingServiceListener;
config.logListener = pushLogListener;
URuStorePushClient::Instance()->Init(сonfig);
Все операции с объектом URuStorePushClient также доступны из Blueprints. Ниже преставлен пример инициализации.
Метод Init принимает в качестве входного параметра структуру FURuStorePushClientConfig. Структура содержит поля:
allowNativeErrorHandling— разрешение на обработку ошибок в нативном SDK;messagingServiceListener— объект класса, реализующего интерфейсIRuStoreMessagingServiceListenerInterface;logListener— объект класса, реализующего интерфейсIRuStoreLogListenerInterface. Этот параметр должен быть задан при установкеRuStoreUnrealLoggerMode.CUSTOMв методе инициализации на стороне Java.
Объекты URuStoreMessagingServiceListener::Instance() и URuStoreLogListener::Instance() реализуют интерфейсы IRuStoreMessagingServiceListenerInterface и IRuStoreLogListenerInterface соответственно.
Их применение позволяет обрабатывать события интерфейсов непосредственно из C++ и Blueprint.
Инициализация URuStoreMessagingServiceListener и URuStoreLogListener совместно с URuStorePushClient.
Деинициализация
Вызов метода Init для URuStorePushClient, URuStoreMessagingServiceListener, URuStoreLogListener привязывает объекты к корню сцены. Если дальнейшая работа с объектами больше не планируется, для освобождения памяти необходимо выполнить метод Dispose. Вызов Dispose отвяжет объект от корня и безопасно завершит все отправленные запросы.
URuStorePushClient::Instance()->Dispose();
URuStoreMessagingServiceListener::Instance()->Dispose();
URuStoreLogListener::Instance()->Dispose();
Логирование событий
Вы можете реализовать собственный класс для логирования событий, используя интерфейс IRuStoreLogListenerInterface.
class RUSTOREPUSH_API IRuStoreLogListenerInterface
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = "RuStore Log Listener Interface")
void LogVerboseResponse(int64 requestId, FString& message, FURuStoreError& error);
UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = "RuStore Log Listener Interface")
void LogDebugResponse(int64 requestId, FString& message, FURuStoreError& error);
UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = "RuStore Log Listener Interface")
void LogInfoResponse(int64 requestId, FString& message, FURuStoreError& error);
UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = "RuStore Log Listener Interface")
void LogWarnResponse(int64 requestId, FString& message, FURuStoreError& error);
UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = "RuStore Log Listener Interface")
void LogErrorResponse(int64 requestId, FString& message, FURuStoreError& error);
};
Методы интерфейса:
LogVerboseResponse— подробные записи для отладки или анализа;LogDebugResponse— записи для отладки;LogInfoResponse— информационные записи;LogWarnResponse— предупреждения;LogErrorResponse— критические ошибки.
Параметры методов:
requestId— id запроса;message— сообщение лога;error— описание ошибки.
Работа с сегментами пользователей
Сегмент — это группа пользователей, которых вы выбираете по определенным параметрам. Например, пользователи, которые приносят наибольший доход, или пользователи со старой вер сией Android. Подробности о сегментах — в документации MyTracker.
Чтобы начать работу с сегментами, укажите clientIdType и clientIdValue при инициализации SDK.
import com.epicgames.ue4.GameApplication;
import ru.rustore.unreal.pushclient.RuStoreUnrealLoggerMode;
import ru.rustore.unreal.pushclient.RuStoreUnrealPushClient;
import ru.rustore.unreal.pushclient.UnrealClientIdType;
public class RuStorePushApplication extends GameApplication {
private final String PROJECT_ID = "6RUviJhYqgNXDXAIL5wqkAP1Rdnd4JmY";
private final RuStoreUnrealLoggerMode LOGGER_MODE = RuStoreUnrealLoggerMode.CUSTOM;
private final UnrealClientIdType CLIENT_ID_TYPE = UnrealClientIdType.GAID;
private final String CLIENT_ID_VALUE = "your_client_id";
@Override
public void onCreate() {
super.onCreate();
RuStoreUnrealPushClient.INSTANCE.init(this, PROJECT_ID, LOGGER_MODE, CLIENT_ID_TYPE, CLIENT_ID_VALUE);
}
}
CLIENT_ID_TYPE— тип идентификатора:UnrealClientIdType.GAID— рекламный идентификатор Google;UnrealClientIdType.OAID— рекламный идентификатор Huawei.
CLIENT_ID_VALUE— значение идентификатора.
Проверка возможности получать push-уведомления
Условия работы push-уведомлений перечислены в разделе Условия корректной работы SDK.
Для проверки того, что приложение-дистрибьютор установлено на устройстве пользователя, используйте методCheckPushAvailability.
Каждый запрос
CheckPushAvailability возвращает requestId, который уникален в рамках одного запуска приложения. Каждое событие возвращает requestId того запроса, который запустил это событие.
long requestId = URuStorePushClient::Instance()->CheckPushAvailability(
[](long requestId, TSharedPtr<FUFeatureAvailabilityResult, ESPMode::ThreadSafe> response) {
// Process response
},
[](long requestId, TSharedPtr<FURuStoreError, ESPMode::ThreadSafe> error) {
// Process error
}
);
Обратный вызов (callback) Success возвращает структуру FURuStoreFeatureAvailabilityResult в параметре Response.
USTRUCT(BlueprintType)
struct RUSTORECORE_API FURuStoreFeatureAvailabilityResult
{
GENERATED_USTRUCT_BODY()
FURuStoreFeatureAvailabilityResult()
{
isAvailable = false;
}
UPROPERTY(BlueprintReadWrite)
bool isAvailable;
UPROPERTY(BlueprintReadWrite)
FURuStoreError cause;
};
isAvailable— выполнение условий выполнения платежей.cause— информация об ошибке. Все возможные ошибкиcauseописаны в разделе Обработка ошибок.
Обратный вызов (callback) Failure возвращает структуру FURuStoreError с информацией об ошибке в параметре Error. Структура ошибки описана в разделе Обработка ошибок.
Методы для работы с push-токеном
Получение push-токена пользователя
Если у пользователя нет push-токена, метод создаст и вернёт новый push-токен.
GetToken, чтобы получить текущий push-токен пользователя.
Каждый запрос
GetToken возвращает requestId, который уникален в рамках одного запуска приложения. Каждое событие возвращает requestId того запроса, который запустил это событие.
long requestId = URuStorePushClient::Instance()->GetToken(
[](long requestId, FString response) {
// Process response
},
[](long requestId, TSharedPtr<FURuStoreError, ESPMode::ThreadSafe> error) {
// Process error
}
);
Обратный вызов (callback) Success возвращает токен в виде строки FString в параметре Response:
response — текущий push-токен.
Обратный вызов (callback) Failure возвращает структуру FURuStoreError с информацией об ошибке в параметре Error. Структура ошибки описана в разделе Обработка ошибок.