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

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

Как push-sdk получает уведомления

На мобильном устройстве пользователя должно быть установлено приложение, которое отвечает за доставку push-уведомлений от нашего SDK. Такое приложение называется «дистрибьютором». Оно периодически обращается к серверу, проверяет наличие новых уведомлений для конкретного приложения, где включён наш SDK, и при их появлении отправляет push-уведомления в конечное приложение.

Основным дистрибьютором служит RuStore, однако если у пользователя нет RuStore, роль резервного дистрибьютора может взять на себя одно из других приложений VK. Выбор делается удалённо на сервере, поэтому мы не раскрываем полный список возможных резервных вариантов. Состав приложений-дистрибьюторов может динамически меняться, поэтому на устройстве конкретного пользователя в любой момент может оказаться другое приложение в этой роли.

Для проверки того, что приложение-дистрибьютор установлено на устройстве пользователя, используйте метод RuStorePushClient.checkPushAvailability.

На устройстве пользователя только одно приложение может работать в качестве дистрибьютора, остальные находятся в "спящем" режиме. Если дистрибьютор был удален с устройства или у него изменились настройки, которые могут влиять на доставку push-уведомлений, то новый дистрибьютор автоматически выберется из резервных.

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

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

Важно
  • Подпись и package name различных типов сборок вашего приложения (debug, release и т.д.) могут отличаться друг от друга. В таком случае вы должны создать в разделе Push-уведомления > Проекты из Консоль RuStore проект под каждый тип сборки..
  • Используется актуальная версия SDK.
  • Загружены данные о приложении в разделе Push-уведомления > Проекты из Консоль RuStore.
  • На устройстве пользователя установлено приложение-дистрибьютор (RuStore и т.д.)

    Для проверки того, что приложение-дистрибьютор установлено на устройстве пользователя, используйте метод RuStorePushClient.checkPushAvailability..
  • Если установлено приложение RuStore, то ему разрешен доступ к работе в фоновом режиме. Без этого разрешения push-уведомления будут приходить, но со значительной задержкой.
  • Отпечаток подписи приложения, установленного на девайсе, совпадает с отпечатком подписи приложения, которое добавлено в разделе 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.

Для проверки того, что приложение-дистрибьютор установлено на устройстве пользователя, используйте метод 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, от которой наследуются остальные ошибки.

См. также