Перейти к основному содержимому

SDK push-уведомлений для Godot Engine (версия 6.3.0)

Условия корректной работы SDK

Ниже перечислены условия работы push-уведомлений.

Важно
  • Подпись тестируемой сборки (например, debug) приложения должна совпадать с подписью сборки приложения, которая была загружена в консоль и прошла модерацию ранее (например, release).
  • Используется актуальная версия SDK.
  • Приложение загружено в Консоль RuStore.
  • Приложение прошло модерацию (публиковать приложение необязательно).
  • На устройстве пользователя установлена актуальная версия RuStore.
  • Приложение RuStore поддерживает функциональность push-уведомлений.
  • Приложению RuStore разрешен доступ к работе в фоновом режиме.
  • Без этого разрешения push-уведомления будут приходить, но со значительной задержкой.
  • Отпечаток подписи приложения, установленного на девайсе, совпадает с отпечатком подписи приложения, которое загружено в Консоль RuStore.
  • Версия Godot 4 или выше.

Пример реализации

Ознакомьтесь с приложением-примером, чтобы узнать, как правильно интегрировать SDK push-уведомлений.

Подключение в проект

предупреждение

Библиотеки плагинов в репозитории собраны для Godot Engine 4.2.1. Если вы используете другую версию Godot Engine, выполните шаги раздела Пересборка плагина.

  1. Скопируйте проекты плагина и приложения-примера из официального репозитория RuStore на GitFlic.
  2. Скопируйте содержимое папки godot_example/android/plugins в папку your_project/android/plugins.
  3. Скопируйте с заменой содержимое папки godot_example/android/build_example в папку godot_example/android/build.
  4. В пресете сборки Android в списке Плагины отметьте Ru Store Godot Push и Ru Store Godot Core.

Редактирование манифеста приложения

В файле манифеста your_project/android/build/AndroidManifest.xml объявите службу, расширяющую RuStoreMessagingService.

AndroidManifest.xml
<service
android:name="ru.rustore.godot.pushclient.RuStoreGodotMessagingService"
android:exported="true"
tools:ignore="ExportedService">
<intent-filter>
<action android:name="ru.rustore.sdk.pushclient.MESSAGING_EVENT" />
</intent-filter>
</service>

Если нужно изменить иконку или цвет стандартной нотификации, добавьте следующий код.

AndroidManifest.xml
<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" />

Если нужно переопределить канал уведомлений, добавьте следующий код.

AndroidManifest.xml
<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-уведомлений.

Activity/Fragment
// 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 проекта.

img

Инициализация SDK push-уведомлений

Добавьте в AndroidManifest.xml следующий код.

AndroidManifest.xml
<meta-data
android:name="ru.rustore.sdk.pushclient.project_id"
android:value="i5UTx96jw6c1C9LvdlE4cdNrWHMNyRBt" />
<meta-data
android:name="ru.rustore.sdk.pushclient.params_class"
android:value="com.godot.game.GodotPushClientParams" />
  • projectIdидентификатор проекта из RuStore Консоль. Чтобы получить его, на странице приложения перейдите в раздел Push-уведомления > Проекты и скопируйте значение в поле ID проекта.
  • (опционально) com.godot.game.GodotPushClientParams — полное имя класса своей реализации RuStoreGodotPushClientParams. Параметр нужен для указания дополнительных параметров инициализации push-клиента.

Пример реализации RuStoreGodotPushClientParams.

GodotPushClientParams.java
package com.godot.game;

import android.content.Context;
import com.vk.push.common.clientid.ClientId;
import com.vk.push.common.clientid.ClientIdCallback;
import com.vk.push.common.clientid.ClientIdType;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import ru.rustore.godot.pushclient.RuStoreGodotLogger;
import ru.rustore.godot.pushclient.RuStoreGodotPushClientParams;
import ru.rustore.sdk.pushclient.common.logger.Logger;

public class GodotPushClientParams extends RuStoreGodotPushClientParams {

public final ClientIdType CLIENT_ID_TYPE = ClientIdType.GAID;
public final String CLIENT_ID_VALUE = "your_gaid_or_oaid";

public GodotPushClientParams(Context context) {
super(context);
}

@NonNull
@Override
public Logger getLogger() {
return RuStoreGodotLogger.INSTANCE;
}

@Override
public boolean getTestModeEnabled() {
return false;
}

@Nullable
@Override
public ClientIdCallback getClientIdCallback() {
return () -> new ClientId(CLIENT_ID_VALUE, CLIENT_ID_TYPE);
}
}

RuStoreGodotPushClientParams расширяет класс ru.rustore.sdk.pushclient.provider.AbstractRuStorePushClientParams.

предупреждение

В реализации класса AbstractRuStorePushClientParams должен быть только один конструктор с одним аргументом Context.

Ручной вызов RuStorePushClient.init() после автоматической инициализации будет проигнорирован.

Инициализация плагина

Перед вызовом методов библиотеки необходимо создать объект клиента push-уведомлений RuStoreGodotPushClient. Для инициализации клиента выполните метод init.

Создание клиента
var _push_client: RuStoreGodotPushClient = null

func _ready:
_push_client = RuStoreGodotPushClient.get_instance()
_push_client.init()

Логирование событий

Если вам необходимо логировать события библиотеки push-уведомлений, реализуйте в вашем наследнике RuStoreGodotPushClientParams метод getLogger. Метод getLogger должен возвращать объект реализующий интерфейс Logger.

Интерфейс Logger
interface Logger {

fun verbose(message: String, throwable: Throwable? = null)
fun debug(message: String, throwable: Throwable? = null)
fun info(message: String, throwable: Throwable? = null)
fun warn(message: String, throwable: Throwable? = null)
fun error(message: String, throwable: Throwable? = null)

fun createLogger(tag: String): Logger
}
Пример реализации логгера
public class DefaultLogger(
private val tag: String? = null,
) : Logger {
override fun verbose(message: String, throwable: Throwable?) {
Log.v(tag, message, throwable)
}

override fun debug(message: String, throwable: Throwable?) {
Log.d(tag, message, throwable)
}

override fun info(message: String, throwable: Throwable?) {
Log.i(tag, message, throwable)
}

override fun warn(message: String, throwable: Throwable?) {
Log.w(tag, message, throwable)
}

override fun error(message: String, throwable: Throwable?) {
Log.e(tag, message, throwable)
}

override fun createLogger(tag: String): Logger {
val newTag = if (this.tag != null) {
"${this.tag}:$tag"
} else {
tag
}
return DefaultLogger(newTag)
}
}
Метод getLogger
@NonNull
@Override
public Logger getLogger() {
return DefaultLogger("your_tag");
}

Если не передать Logger, SDK использует реализацию по умолчанию с AndroidLog.

Чтобы логировать события с использованием скриптинга Godot, используйте релизацию логгера RuStoreGodotLogger. После инициализации плагина единожды выполните подписку на события и воспользуйтесь методом init_logger.

Метод getLogger
import ru.rustore.godot.pushclient.RuStoreGodotLogger;

@NonNull
@Override
public Logger getLogger() {
return RuStoreGodotLogger.INSTANCE;
}
События on_log_*
func _ready:
# Инициализация _push_client

_push_client.on_log_verbose.connect(_on_log_verbose)
_push_client.on_log_debug.connect(_on_log_debug)
_push_client.on_log_info.connect(_on_log_info)
_push_client.on_log_warn.connect(_on_log_warn)
_push_client.on_log_error.connect(_on_log_error)

func _on_log_verbose(message: String):
pass

func _on_log_debug(message: String):
pass

func _on_log_info(message: String):
pass

func _on_log_warn(message: String):
pass

func _on_log_error(message: String):
pass

message — сообщение лога.

Вызов метода init_logger
_push_client.init_logger()

Работа с сегментами пользователей

Сегмент — это группа пользователей, которых вы выбираете по определенным параметрам. Например, пользователи, которые приносят наибольший доход, или пользователи со старой версией Android. Подробности о сегментах — в документации MyTracker.

Чтобы начать работу с сегментами, укажите ClientIdType и ClientIdValue при инициализации SDK.

GodotPushClientParams.java
package com.godot.game;

import android.content.Context;
import com.vk.push.common.clientid.ClientId;
import com.vk.push.common.clientid.ClientIdCallback;
import com.vk.push.common.clientid.ClientIdType;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import ru.rustore.godot.pushclient.RuStoreGodotLogger;
import ru.rustore.godot.pushclient.RuStoreGodotPushClientParams;
import ru.rustore.sdk.pushclient.common.logger.Logger;

public class GodotPushClientParams extends RuStoreGodotPushClientParams {

public final ClientIdType CLIENT_ID_TYPE = ClientIdType.GAID;
public final String CLIENT_ID_VALUE = "your_gaid_or_oaid";

public GodotPushClientParams(Context context) {
super(context);
}

@NonNull
@Override
public Logger getLogger() {
return RuStoreGodotLogger.INSTANCE;
}

@Override
public boolean getTestModeEnabled() {
return false;
}

@Nullable
@Override
public ClientIdCallback getClientIdCallback() {
return () -> new ClientId(CLIENT_ID_VALUE, CLIENT_ID_TYPE);
}
}
  • CLIENT_ID_TYPE — тип идентификатора:
    • ClientIdType.GAID — рекламный идентификатор Google;
    • ClientIdType.OAID — рекламный идентификатор Huawei.
  • CLIENT_ID_VALUE — значение идентификатора.

Проверка возможности получать push-уведомления

Условия работы push-уведомлений приведены в разделе Условия корректной работы SDK.

Для проверки того, что приложение RuStore установлено на устройстве пользователя, используйте метод check_push_availability.

 Перед использованием метода единожды выполните подписку на события:

  • on_check_push_availability_success;
  • on_check_push_availability_failure.
Подписка на события
func _ready():
# Инициализация _push_client

_push_client.on_check_push_availability_success.connect(_on_check_push_availability_success)
_push_client.on_check_push_availability_failure.connect(_on_check_push_availability_failure)

func _on_check_push_availability_success(result: RuStoreFeatureAvailabilityResult):
pass

func _on_check_push_availability_failure(error: RuStoreError):
pass
Вызов метода check_push_availability
_push_client.check_push_availability()
  • Обратный вызов (callback) on_check_push_availability_success возвращает объект RuStoreFeatureAvailabilityResult с информацией о доступности сервиса.
Класс RuStoreFeatureAvailabilityResult
class_name RuStoreFeatureAvailabilityResult extends Object

var isAvailable: bool = false
var cause: RuStoreError = null

func _init(json: String = ""):
if json != "":
var obj = JSON.parse_string(json)
isAvailable = obj["isAvailable"]

if obj.has("cause"):
var jcause = JSON.stringify(obj["cause"])
cause = RuStoreError.new(jcause)
  • isAvailable — выполнение условий приёма push-уведомлений:
    • true — условия выполнены;
    • false — условия не выполнены.
  • cause — информация об ошибке. Структура класса RuStoreError и все возможные ошибки описаны в разделе Обработка ошибок
  • Обратный вызов (callback) on_check_push_availability_failure возвращает объект RuStoreError со всеми прочими ошибками, например, — «Нет соединения с интернетом». Структура класса RuStoreError описана в разделе Обработка ошибок.

Методы для работы с push-токеном

Получение push-токена пользователя

предупреждение

Если у пользователя нет push-токена, метод создаст и вернёт новый push-токен.

После инициализации библиотеки вы можете использовать метод get_token, чтобы получить текущий push-токен пользователя.

 Перед использованием метода единожды выполните подписку на события:

  • on_get_token_success;
  • on_get_token_failure.
Подписка на события
func _ready():
# Инициализация _push_client

_push_client.on_get_token_success.connect(_on_get_token_success)
_push_client.on_get_token_failure.connect(_on_get_token_failure)

func _on_get_token_success(data: String):
pass

func _on_get_token_failure(error: RuStoreError):
pass
Вызов метода get_token
_push_client.get_token()
  • Обратный вызов (callback) on_get_token_success возвращает строку с информацией о текущем push-токене.

  • Обратный вызов (callback) on_get_token_failure возвращает объект RuStoreError с информацией об ошибке. Структура класса RuStoreError описана в разделе Обработка ошибок.

Удаление push-токена пользователя

После инициализации библиотеки вы можете использовать метод delete_token, чтобы удалить текущий push-токен пользователя.

 Перед использованием метода единожды выполните подписку на события:

  • on_delete_token_success;
  • on_delete_token_failure.
Подписка на события
func _ready():
# Инициализация _push_client

_push_client.on_delete_token_success.connect(_on_delete_token_success)
_push_client.on_delete_token_failure.connect(_on_delete_token_failure)

func _on_delete_token_success():
pass

func _on_delete_token_failure(error: RuStoreError):
pass
Вызов метода delete_token
_push_client.delete_token()

Обратный вызов (callback) on_delete_token_failure возвращает объект RuStoreError с информацией об ошибке. Структура класса RuStoreError описана в разделе Обработка ошибок.

Методы для работы с push-топиком

Подписка на push-уведомления по топику

После инициализации библиотеки вы можете использовать метод subscribe_to_topic для подписки на топик.

 Перед использованием метода единожды выполните подписку на события:

  • on_subscribe_to_topic_success;
  • on_subscribe_to_topic_failure.
Подписка на события
func _ready():
# Инициализация _push_client

_push_client.on_subscribe_to_topic_success(_on_subscribe_to_topic_success)
_push_client.on_subscribe_to_topic_failure(_on_subscribe_to_topic_failure)

func _on_subscribe_to_topic_success():
pass

func _on_subscribe_to_topic_failure(error: RuStoreError):
pass
Вызов метода subscribe_to_topic
const TOPIC_NAME = "hello"

_push_client.subscribe_to_topic(TOPIC_NAME)

TOPIC_NAME — имя топика.

Обратный вызов (callback) on_subscribe_to_topic_success сигнализирует об успешном выполнении операции.

Обратный вызов (callback) on_subscribe_to_topic_failure возвращает объект RuStoreError с информацией об ошибке. Структура класса RuStoreError описана в разделе Обработка ошибок.

Отписка от push-уведомлений по топику

После инициализации библиотеки вы можете использовать метод unsubscribe_from_topic для отписки от топика.

 Перед использованием метода единожды выполните подписку на события:

  • on_unsubscribe_from_topic_success;
  • on_unsubscribe_from_topic_failure.
Подписка на события
func _ready():
# Инициализация _push_client

_push_client.on_unsubscribe_from_topic_success(_on_unsubscribe_from_topic_success)
_push_client.on_unsubscribe_from_topic_failure(_on_unsubscribe_from_topic_failure)

func _on_unsubscribe_from_topic_success():
pass

func _on_unsubscribe_from_topic_failure(error: RuStoreError):
pass
};
Вызов метода unsubscribe_from_topic
const TOPIC_NAME = "hello"

_push_client.unsubscribe_from_topic(TOPIC_NAME)

TOPIC_NAME — имя топика.

Обратный вызов (callback) on_unsubscribe_to_topic_success сигнализирует об успешном выполнении операции.

Обратный вызов (callback) on_unsubscribe_to_topic_failure возвращает объект RuStoreError с информацией об ошибке. Структура класса RuStoreError описана в разделе Обработка ошибок.

Получение данных от RuStore SDK

Чтобы получать данные push-уведомлений от RuStore SDK, после создания клиента и инициализации единожды выполните подписку на события:

  • on_new_token;
  • on_message_received;
  • on_deleted_messages;
  • on_error.
Подписка на события
func _ready:
# Инициализация _push_client

_push_client.on_new_token.connect(_on_new_token)
_push_client.on_message_received.connect(_on_message_received)
_push_client.on_deleted_messages.connect(_on_deleted_messages)
_push_client.on_error.connect(_on_error)

func _on_new_token(data: String):
pass

func _on_message_received(data: Dictionary):
pass

func _on_deleted_messages():
pass

func _on_error(errors: Array):
pass
Название методаОписание

on_new_token

Метод вызывается при получении нового push-токена. После вызова этого метода ваше приложение становится ответственно за передачу нового push-токена на свой сервер. Метод возвращает значение нового токена.

on_message_received

Метод вызывается при получении нового push-уведомления.

Если в объекте notification есть данные, RuStore SDK самостоятельно отображает уведомление. Если вы не хотите этого, используйте объект data, а notification оставьте пустым. Метод вызывается в любом случае.

Получить payload push-уведомления можно из поля data[data].

on_deleted_messages

Метод вызывается, если один или несколько push-уведомлений не доставлены на устройство. Например, если время жизни уведомления истекло до момента доставки.

При вызове этого метода рекомендуется синхронизироваться со своим сервером, чтобы не пропустить данные.

on_error

Метод вызывается, если в момент инициализации возникает ошибка. Он возвращает массив объектов с ошибками.

Возможные ошибки:

  • UnauthorizedException — пользователь не авторизован в RuStore. Ошибка может не возникать, даже если пользователь не авторизован в RuStore. Это поведение управляется динамически в Push SDK. Если ваши пользователи не получают такую ошибку, то все равно имеет смысл ее обрабатывать;
  • HostAppNotInstalledException — RuStore отсутствует на устройстве пользователя;
  • HostAppBackgroundWorkPermissionNotGranted — у RuStore нет разрешения на работу в фоне. Ошибка не критична. Пуши продолжат приходить, но хуже, чем если бы разрешение на работу в фоне было выдано.
Все возможные ошибки описаны в разделе Обработка ошибок.

Структура уведомления

Структура объекта RuStoreRemoteMessage
class_name RuStoreRemoteMessage extends Object

var messageId = null
var priority: int = 0
var ttl: int = 0
var from: String = ""
var collapseKey = null
var data: Dictionary = {}
var rawData = null
var notificationData: RuStoreNotification = null

func _init(json: String = ""):
if json != "":
var obj = JSON.parse_string(json)

if obj.has("messageId"):
messageId = obj["messageId"]

priority = int(obj["priority"])
ttl = int(obj["ttl"])
from = obj["from"]

if obj.has("collapseKey"):
collapseKey = obj["collapseKey"]

if obj.has("data"):
data = obj["data"]

if obj.has("rawData"):
rawData = obj["rawData"]

if obj.has("notification"):
var notificationJson: String = JSON.stringify(obj["notification"])
notificationData = RuStoreNotification.new(notificationJson)
  • messageId — уникальный ID сообщения. Является идентификатором каждого сообщения.
  • priority — возвращает значение приоритетности (на данный момент не учитывается). Сейчас заложены следующие варианты:
    • 0UNKNOWN;
    • 1HIGH;
    • 2NORMAL.
  • ttl — время жизни push-уведомления типа Int в секундах.
  • from — поле, по которому можно понять, откуда пришло уведомление:
    • для уведомлений, отправленных в топик, в поле отображается имя топика;
    • в других случаях — часть вашего сервисного токена.
    .
  • collapseKey — идентификатор группы уведомлений (на данный момент не учитывается).
  • data — словарь, в который можно передать дополнительные данные для уведомления.
  • rawData — словарь data в виде массива байтов.
  • notification — объект уведомления.
Структура объекта Notification
class_name RuStoreNotification extends Object

var title = null
var body = null
var channelId = null
var imageUrl = null
var color = null
var icon = null
var clickAction = null
var clickActionType = null

func _init(json: String = ""):
if json != "":
var obj = JSON.parse_string(json)

if obj.has("title"):
title = obj["title"]

if obj.has("body"):
body = obj["body"]

if obj.has("channelId"):
channelId = obj["channelId"]

if obj.has("imageUrl"):
imageUrl = obj["imageUrl"]

if obj.has("color"):
color = obj["color"]

if obj.has("icon"):
icon = obj["icon"]

if obj.has("clickAction"):
clickAction = obj["clickAction"]

if obj.has("clickActionType"):
clickActionType = ERuStoreClickActionType.Item.get(obj["clickActionType"])
  • title — заголовок уведомления.
  • body — тело уведомления.
  • channelId — возможность задать канал, в который отправится уведомление. Актуально для Android 8.0 и выше.
  • imageUrl — прямая ссылка на изображение для вставки в уведомление. Изображение должно быть не более 1 Мбайт.
  • color — цвет уведомления в HEX-формате, строкой. Например, #0077FF.
  • icon — значок уведомления из res/drawable в формате строки, которая совпадает с названием ресурса.
    Например, в res/drawable есть значок small_icon.xml, который доступен в коде через R.drawable.small_icon.
    Чтобы значок отображался в уведомлении, сервер должен указать в параметре icon значение small_icon
    .
  • clickActionintent action, с помощью которого будет открыта активити при клике на уведомление.
  • clickActionType — тип поля clickAction.
Перечисление ERuStoreClickActionType
class_name ERuStoreClickActionType extends Object

enum Item {
NONE,
DEFAULT,
DEEP_LINK
}
  • NONE — значение параметра не определено.

  • DEFAULT — тип поля clickAction при котором clickAction будет использоваться как intent action для открытия активити по клику на уведомление. Подробнее смотри документацию.

  • DEEP_LINK — тип поля clickAction при котором clickAction будет использоваться как deep link для открытия активити по клику на уведомление. Подробнее смотри документацию.

Создание канала для отправки уведомления

Для канала, в который отправляется уведомление, действует следующий приоритет.

  • Если в push-уведомлении есть поле channelId, RuStore SDK отправит уведомление в указанный канал. Ваше приложение должно создать этот канал заранее.

  • Если в push-уведомлении нет поля channelId, но ваше приложение указало параметр с каналом в AndroidManifest.xml, используется указанный канал. Ваше приложение должно создать этот канал заранее.

  • Если в push-уведомлении нет поля channelId, и канал по умолчанию не задан в AndroidManifest.xml, RuStore SDK создаст канал и отправит уведомление в него. В дальнейшем все уведомления без явного указания канала будут отправляться в этот канал.

Открытие activity при нажатии на уведомление

По умолчанию, если нажать на уведомление, RuStore SDK откроет activity с action android.intent.action.MAIN. Если есть поле clickAction, RuStore SDK откроет activity, которая попадает под Intent filter с указанным action.

Добавьте строку <category android:name="android.intent.category.DEFAULT" /> в манифесте приложения в соответствующем элементе <intent-filter> у activity. Это нужно, чтобы при нажатии на уведомление по умолчанию открывалась activity. Без этой строки в RuStore SDK activity не откроется.

Чтобы SDK смог открыть game activity без перезагрузки игры, нужно очистить intent при переходе в приложение после нажатия на push-уведомление. Для этого:

  1. Перейдите в папку your_project/android/build/src/com /godot/game.

  2. Создайте класс GodotPushApp, наследника FullScreenGodotApp.

Пример реализации GodotPushApp
package com.godot.game;

import org.godotengine.godot.FullScreenGodotApp;
import android.os.Bundle;

public class GodotPushApp extends FullScreenGodotApp {

@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(R.style.GodotAppMainTheme);
super.onCreate(savedInstanceState);
}
}
  1. Измените класс GodotApp.
Пример реализации GodotApp
package com.godot.game;

import android.content.Intent;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;

public class GodotApp extends AppCompatActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(R.style.GodotAppMainTheme);
super.onCreate(savedInstanceState);

/**
* Processing intenss here
*/

Intent newIntent = new Intent(this, GodotPushApp.class);
startActivity(newIntent);
finish();
}
}
  1. Добавьте информацию об activity GodotPushApp в манифест your_project/android/build/AndroidManifest.xml.
AndroidManifest.xml
<activity
android:name="com.godot.game.GodotPushApp"
android:label="@string/godot_project_name_string"
android:theme="@style/GodotAppSplashTheme"
android:launchMode="singleInstance"
android:excludeFromRecents="false"
android:exported="true"
android:screenOrientation="sensor"
android:configChanges="orientation|keyboardHidden|screenSize|smallestScreenSize|density|keyboard|navigation|screenLayout|uiMode"
android:resizeableActivity="false"
tools:ignore="UnusedAttribute" >
</activity>
  1. Измените android:launchMode="singleInstance" на android:launchMode="singleTask" в activity android:name=".GodotApp".

Обработка ошибок

Структура ошибки
class_name RuStoreError extends Object

var description: String

func _init(json: String = ""):
if json == "":
description = ""
else:
var obj = JSON.parse_string(json)
description = obj["detailMessage"]
  • description — описание ошибки.

Ниже представлены классы ошибок.

  • RuStoreNotInstalledException — на устройстве пользователя не установлен RuStore.
  • RuStoreOutdatedException — версия RuStore, установленная на устройстве пользователя, не поддерживает данный SDK.
  • RuStoreUserUnauthorizedException — пользователь не авторизован в RuStore.
  • RuStoreFeatureUnavailableException — RuStore не имеет разрешения на работу в фоне.
  • RuStoreException — базовая ошибка RuStore, от которой наследуются остальные ошибки.

См. также