Начало работы с MyGamesSupport🔗
Для интеграции MyGamesSupport необходимо выполнить несколько простых шагов
Шаг 1. Импортируйте модуль поддержки🔗
-
Добавьте модуль MRGSSupport
Unity:
Добавление в проект (общая инструкция)
Шаг 1. Добавьте источники
Для того, чтобы добавить MRGS в проект через Unity Package Manager (доступно с Unity 2018+) просто добавьте в файл
Packages/manifest.jsonразделscopedRegistries, добавив в него следующую запись:{ "dependencies": { ... }, "scopedRegistries": [ { "name": "MRGS", "url": "https://mrgs-nexus.my.games/repository/mrgs-uninty-plugins/", "scopes": [ "games.my.mrgs" ] } ] }Альтернативно, можно нажать
Edit -> Project Settings -> Package Manager -> '+' in scoped registry section, и заполнить поля в соответствии с данными выше.Шаг 2. Добавьте зависимость
- Нажмите
Window -> Package Manager -> select 'Packages: MyRegistries' from dropdown list, выберите пакетMRGSSupportиз списка, затем нажмите "Install" - Импортируйте модуль:
using MRGS;
- Загрузите последнюю версию библиотеки. Распакуйте архив.
- (Для интеграции unitypackage) В Unity нажмите
Assets -> Import Package -> Custom Package, и выберите пакетgames.my.mrgs.support.unitypackageиз скачанного архива. - (Для интеграции tgz) В Unity нажмите
Window -> Package Manager -> '+' -> Add package from tarball, и выберите пакетgames.my.mrgs.support-<version>.tgzиз скачанного архива. - Импортируйте модуль:
using MRGS;
iOS:
Добавление в проект (общая инструкция)
Шаг 1. Добавьте зависимости
Через Package collection
- В Xcode выберите File > Add Packages
- Выберите «+» > "Add Swift Package Collection"
- Вставьте URL:
https://mrgs-nexus.my.games/repository/ios-sdks/MRGSPackageCollection.json - Выберите модуль MRGSSupport из "MRGS Package Collection".
- Или вы можете выбрать пакет «MRGS» из "MRGS Package Collection" (содержит все модули mrgs в качестве продуктов), а затем выбрать только продукт "MRGS/Support".
Отдельными пакетами
- В Xcode выберите File > Add Packages
- В строке поиска в правом верхнем углу вставьте URL:
https://mrgs-gitea.my.games/mrgs/mrgssupport-ios-sdk.git - Добавьте модуль в свой проект
- Или вы можете вставить URL
https://mrgs-gitea.my.games/mrgs/ios-sdks.git, чтобы подключить пакет "MRGS", который содержит все модули mrgs в качестве продуктов, а затем выбрать только продукт "MRGS/Support".
Шаг 2. Добавьте поддержку категорий ObjectiveC
- В настройках проекта установите флаг
-ObjCв поле "Other linker Flags". - Импортируйте модуль в коде:
@import MRGServiceKit;или@import MRGSSupport;или#import <MRGSSupport/MRGSSupport.h>
Шаг 1. Добавьте источники
В вашем podfile добавьте источники в начало файла:
source 'https://github.com/CocoaPods/Specs.git' # For main repo source 'https://mrgs-gitea.my.games/mrgs/cocoapods-specs.git' # For MRGS repoШаг 2. Добавьте зависимости
В target добавьте последнюю версию MRGSSupport:
Чтобы добавить через subspecs:
Для добавления через отдельные модули:
Чтобы добавить все модули mrgs:
Шаг 3. Установите зависимости
- Выполните
pod install(илиpod install --repo-updateесли необходимо) - Импортируйте модуль в коде:
@import MRGServiceKit;или@import MRGSSupport;или#import <MRGSSupport/MRGSSupport.h>
Шаг 1. Добавьте зависимости
Добавьте зависимость в ваш Cartfile:
Шаг 2. Установите зависимости
- Выполните
carthage update --use-xcframeworks - Добавьте загруженные фреймворки в свой проект (убедитесь, что опция "do not embed" включена)
- В настройках проекта установите флаг
-ObjCв поле "Other linker Flags". - Импортируйте модуль в коде:
@import MRGServiceKit;или@import MRGSSupport;или#import <MRGSSupport/MRGSSupport.h>
- Загрузите последнюю версию библиотеки. Распакуйте архив.
-
Добавьте
MRGSSupport.xcframeworkиз скачанного архива в ваш проект (Перетащите библиотеки в раздел "Linked frameworks and Libraries") (для совместимости в архиве также находится MRGSSupport.framework - fat framework старого вида) -
В настройках проекта установите флаг
-ObjCв поле "Other linker Flags". - Импортируйте модуль в коде:
@import MRGSSupport;или#import <MRGSSupport/MRGSSupport.h> - Также, вы можете добавить из архива файлы
MRGServiceKit.hиmodule.modulemapв свой проект, либо в настройках проекта укажите путь до них в разделеBuild Settings -> Header search paths. Теперь вместо импорта каждого из наших фреймворков по отдельности, вы можете импортировать только один заголовочный файл:@import MRGServiceKit;
Android:
Добавление в проект
Добавьте зависимость в
build.gradleфайл: - Нажмите
Шаг 2. Предварительная настройка🔗
О безопасности и авторизации
Виджет поддержки может содержать в переписках персональные данные пользователя. Чтобы точно не допустить неавторизованного доступа к данным, система поддержки должна иметь понимание того, что пользователь имеет право на такие действия. Лучше всего для этого подходит авторизация или верификация пользователя (например в приложениях с авторизацией сервер s2s может по accessToken получить реальные данные о пользователе, которые нельзя подделать с клиента или извне), но так как во многих играх пользователь - это просто строковый идентификатор, который нельзя подтвердить логином/паролем, то для таких проектов точно верифицировать пользователя нельзя, и для таких случаев можно только открывать "анонимную" страницу поддержки - она завязана на связку userId и deviceID, это позволяет гарантировать безопасность данных пользователя, т.к. подобрать такую связку практически невозможно, но при таком подходе при переходе на новое устройство, вся история переписки потеряется, в отличие от проектов с авторизацией, поскольку они могут подтвердить подлинность пользователя. Для подтверждения пользователя можно использовать и сторонние системы авторизации (например, Facebook, VK, MyGames), т.к. также по accessToken можно получить реальные данные о пользователе без возможности их подделать.
Таким образом, виджет поддержки можно открыть используя два подхода:
- Авторизованный пользователь, данные о котором можно верифицировать s2s - переписка видна при входе с любого устройства
- Используя "анонимную" учетную запись на основе связки userId и deviceID - переписка пропадает при переходе на другое устройство
MRGS поддерживает оба подхода:
- При отсутствии дополнительных настроек, будет открыта "анонимная" запись
- Можно добавить при открытии виджета авторизацию в сторонней системе - мы поддерживаем MyGames, Facebook, VK. При таком открытии вся переписка анонимной ученой записи, которая была до открытия, синхронизируется и связывается с аккаунтом в сторонней системе, позволяя видеть переписки на любом устройстве. Более того, при использовании модуля MRGSAuthentication, авторизация в сетях передается в виджет автоматически. (То есть как только открывают виджет с аккаунтом в сторонней сети, мы их связываем, и потом переписку можно увидеть на любом устройстве, это поможет при решении проблем - можно будет попросить пользователя зайти, например, в MyGames, и он вернет историю своей переписки с поддержкой, а поддержке будет виден его старый аккаунт)
Также, в случае, если у проекта есть своя авторизация, или есть возможность однозначно верифицировать пользователя, и необходимо сделать доступ к переписке исключительно безопасным и закрытым только по авторизации, проект может сам авторизовать пользователя в widget поддержки (1-ый способ из перечисленных выше). Для этого проекту нужно самому получить код авторизации по S2S API с сервера MyGamesSupport (зашивая в него все параметры отображения виджета), и передать его в MRGS при открытии виджета - такой способ мы также поддерживаем.
Шаг 2.1. Добавление системных разрешений на доступ к файлам🔗
Так как пользователь может отправить в переписку фото и файлы, а также скачать их из переписки, необходимы соответствующие разрешения
Шаг 2.1.1 Установка разрешений для iOS🔗
Для iOS проверьте, что у Вашего приложения стоят настройки NSCameraUsageDescription и NSPhotoLibraryUsageDescription в Info.plist приложения, так как в окне поддержки пользователь может захотеть добавить фотографию или скриншот из библиотеки. Пример части Info.plist для вышеуказанных полей:
<key>NSCameraUsageDescription</key>
<string>We use camera so you can send photo to support, if you have problems.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>We use photo library so you can send screenshot to support, if you have problems.</string>
Шаг 2.1.2. Установка разрешений для Android🔗
Для корректной работы на Android необходимо наличие разрешения READ_EXTERNAL_STORAGE и WRITE_EXTERNAL_STORAGE. Модуль MRGSSupport уже включает в своем манифесте это разрешение. На Android 6 и выше оно будет запрошено у пользователя автоматически, если у приложения еще нет доступа к внешнему носителю
Шаг 2.1.3. Локализация запроса разрешений для Android🔗
Также, можно передать нужную локализацию для диалоговых окон для объяснения зачем нужны разрешения на доступ к хранилищу:
MRGSMyGamesSupport.Localization localization = new MRGSMyGamesSupport.Localization();
// The text of the message that will be shown to the user (player) if an error occurs while working with support.
localization.SetErrorDialogParams(string title, string message, string button)
// Explanation of why write access to the storage is needed.
localization.SetWritePermissionRationaleDialogParams(string title, string message, string okButton, string cancelButton);
// Explanation of how to enable the required permission in the settings.
localization.SetWritePermissionSettingsDialogParams(string title, string message, string settingsButton, string cancelButton)
// Setting to config before opening widget
var widgetConfig = new MRGSMyGamesSupport.WidgetConfig();
widgetConfig.DialogLocalization = localization;
import games.my.mrgs.support.MRGSMyGamesSupportLocalization;
final MRGSMyGamesSupportLocalization localization = MRGSMyGamesSupportLocalization.newInstance();
// The text of the message that will be shown to the user (player) if an error occurs while working with support.
localization.setErrorDialogParams(String title, String message, String button)
// Explanation of why write access to the storage is needed.
localization.setWritePermissionRationaleDialogParams(String title, String message, String okButton, String cancelButton);
// Explanation of how to enable the required permission in the settings.
localization.setWritePermissionSettingsDialogParams(String title, String message, String settingsButton, String cancelButton)
Шаг 2.2. Установка игрового идентификатора пользователя🔗
Только при работе через MRGS
В случае, если вы решили получать код авторизации виджета самостоятельно, можете пропустить данный шаг, т.к. userId зашит в код авторизации.
Для корректной работы MyGamesSupport необходимо установить игровой идентификатор пользователя до открытия окна поддержки. Про установку идентификатора пользователя читайте в разделе "Подключение SDK" Unity, iOS, Android
Как указать пользователя, отличного от выставленного в MRGS?
В случае, если для открытия окна поддержки вы хотите использовать идентификатор пользователя, отличный от выставленного при старте MRGS, вы можете установить его с помощью метода:
Шаг 3. Показ виджета поддержки🔗
Шаг 3.1. Настройка параметров показа виджета🔗
Перед тем, как показать виджет (обычный виджет, окно поддержки, список запросов или любую другую страницу), вы можете настроить некоторые параметры показа:
- Тему оформления виджета: может быть светлой, темной, темно-оранжевой, или определяться автоматически на основе темы устройства. По умолчанию будет открыта светлая тема.
- Язык оформления виджета: если не установлен, то будет выбран автоматически на основе языка устройства. Если установлен неподдерживаемый язык, будет выбрана английская локализация.
- Дополнительные параметры пользователя: вы можете передать json с доп. информацией в виджет. (например указать, что это vip юзер)
Пример установки всех параметров:
var widgetConfig = new MRGSMyGamesSupport.WidgetConfig();
// Optional. Set up the theme of the widget (Default value is Light).
widgetConfig.Theme = MRGSMyGamesSupport.WidgetTheme.DeviceTheme;
// Optional. Set up a language in ISO alpha-2 format (By default the device language will be used).
widgetConfig.Language = "fr";
// or use MRGS class helper
widgetConfig.Language = MRGSUtils.SystemLanguageToISO(SystemLanguage.English);
widgetConfig.ExtraParameters = "{\"vip\" : true}";
MRGSMyGamesSupportWidgetConfig* widgetConfig = [[MRGSMyGamesSupportWidgetConfig alloc] init];
// Optional. Set up the theme of the widget (Default value is Light).
widgetConfig.theme = MRGSMyGamesSupportWidgetThemeDeviceTheme;
// Optional. Set up a language in ISO alpha-2 format (By default the device language will be used).
widgetConfig.language = @"fr";
// Optional. Set up extra params in JSON format.
widgetConfig.extraParameters = @"{\"vip\" : true}";
import games.my.mrgs.support.MRGSMyGamesSupport;
import games.my.mrgs.support.MRGSMyGamesSupportWidgetConfig;
final MRGSMyGamesSupportWidgetConfig widgetConfig = MRGSMyGamesSupportWidgetConfig.newInstance();
// Optional. Set up the theme of the widget (Default value is Light).
widgetConfig.setTheme(MRGSMyGamesSupport.WidgetTheme.SYSTEM);
// Optional. Set up a language in ISO alpha-2 format (By default the device language will be used).
widgetConfig.setLanguage("fr");
// Optional. Set up extra params in JSON format.
widgetConfig.setExtraParameters("{\"vip\" : true}");
Установка кода авторизации при его получении самостоятельно
В случае, если вы решили получать код авторизации виджета самостоятельно, для начала вам нужно безопасно получить код авторизации через S2S api MyGamesSupport, описание API можно посмотреть здесь. Затем, необходимо выставить его в созданный выше объект настроек и передать в методы показа (так как при авторизации напрямую параметры показа зашиваются в код авторизации, остальные настройки в конфигурации не будут применены):
Шаг 3.2. Добавление сторонней авторизации🔗
Только при работе через MRGS
В случае, если вы решили получать код авторизации виджета самостоятельно, можете пропустить данный шаг, т.к. userId зашит в код авторизации.
Для доступа к аккаунту с любого устройства и связки анонимного аккаунта и аккаунта соцсети, нужно пробросить в виджет авторизацию. При использовании модуля MRGSAuthentication, мы добавим авторизацию в сетях MyGames, Facebook, VK автоматически. В случае, если у вас авторизация выполнена своими силами, мы можете передать ее в виджет с помощью метода:
var widgetConfig = new MRGSMyGamesSupport.WidgetConfig();
// MyGames
var authMyGames = MRGSMyGamesSupportCredential.Create(MRGSMyGamesSupportCredential.SocialNetwork.MyGames, "some_token");
widgetConfig.AddAuthentication(authMyGames);
// Facebook
var authFacebook = MRGSMyGamesSupportCredential.Create(MRGSMyGamesSupportCredential.SocialNetwork.Facebook, "some_token");
widgetConfig.AddAuthentication(authFacebook);
MRGSMyGamesSupportWidgetConfig* widgetConfig = [[MRGSMyGamesSupportWidgetConfig alloc] init];
// MyGames
MRGSMyGamesSupportCredential* credentialMyGames = [MRGSMyGamesSupportCredential credentialWithSocialNetwork:kMRGSMyGamesSupportCredentialSocialNetworkMyGames token:@"fakeToken"];
[widgetConfig addAuthentication: credentialMyGames];
// Facebook
MRGSMyGamesSupportCredential* credentialFacebook = [MRGSMyGamesSupportCredential credentialWithSocialNetwork:kMRGSMyGamesSupportCredentialSocialNetworkFacebook token:@"fakeToken"];
[widgetConfig addAuthentication: credentialFacebook];
import games.my.mrgs.support.MRGSMyGamesSupport.Credential;
import games.my.mrgs.support.MRGSMyGamesSupportWidgetConfig;
final MRGSMyGamesSupportWidgetConfig widgetConfig = MRGSMyGamesSupportWidgetConfig.newInstance();
// MyGames
final Credential credentialMyGames = new Credential(Credential.SocialNetwork.MY_GAMES, "some_token");
widgetConfig.addAuthentication(credentialMyGames);
// Facebook
final Credential credentialFacebook = new Credential(Credential.SocialNetwork.FACEBOOK, "some_token");
widgetConfig.addAuthentication(credentialFacebook);
Добавление ключа для VK авторизации
В случае, если вы используете авторизацию в VK (через MRGSAuthentication или пробрасываете в виджет сами), чтобы MRGS мог валидировать юзера, нужно добавить сервисный ключ приложения VK (раздел "Настройки->Сервисный ключ доступа" на сайте VK) в админке MRGS в разделе "Интеграции->VK Access Token".
Шаг 3.3 Выбор страницы для показа🔗
По умолчанию будет открыта главная страница виджета, но при необходимости вы можете указать конкретную страницу/раздел виджета, например, окно просмотра ответов, окно конкретного запроса, окно feedback, кастомный путь. Полный список можно посмотреть в классе MRGSMyGamesSupportWidgetPage.
MRGSMyGamesSupportWidgetConfig* widgetConfig = [[MRGSMyGamesSupportWidgetConfig alloc] init];
widgetConfig.page = MRGSMyGamesSupportWidgetPage.ticketsListPage;
[[MRGSMyGamesSupport sharedInstance] showWidgetInView:presentationView config:widgetConfig completionHandler:^(NSError * _Nullable error) {
// Handle result here.
}];
import androidx.annotation.Nullable;
import games.my.mrgs.MRGSError;
import games.my.mrgs.support.MRGSMyGamesSupport;
import games.my.mrgs.support.MRGSMyGamesSupportWidgetConfig;
import games.my.mrgs.support.MRGSMyGamesSupportWidgetPage;
import games.my.mrgs.utils.optional.Consumer;
final MRGSMyGamesSupportWidgetConfig widgetConfig = MRGSMyGamesSupportWidgetConfig.newInstance();
widgetConfig.setPage(MRGSMyGamesSupportWidgetPage.TICKETS_LIST);
MRGSMyGamesSupport.getInstance().show(activity, widgetConfig, new Consumer<MRGSError>() {
@Override
public void accept(@Nullable MRGSError error) {
// Handle result here
}
});
Окно Feedback
Обратите внимание, что вы можете показать окно feedback - отдельную страницу для отправки отзывов.
MRGSMyGamesSupportWidgetConfig* widgetConfig = [[MRGSMyGamesSupportWidgetConfig alloc] init];
widgetConfig.page = MRGSMyGamesSupportWidgetPage.feedbackPage;
[[MRGSMyGamesSupport sharedInstance] showWidgetInView:presentationView config:widgetConfig completionHandler:^(NSError * _Nullable error) {
// Handle result here.
}];
import androidx.annotation.Nullable;
import games.my.mrgs.MRGSError;
import games.my.mrgs.support.MRGSMyGamesSupport;
import games.my.mrgs.support.MRGSMyGamesSupportWidgetConfig;
import games.my.mrgs.support.MRGSMyGamesSupportWidgetPage;
import games.my.mrgs.utils.optional.Consumer;
final MRGSMyGamesSupportWidgetConfig widgetConfig = MRGSMyGamesSupportWidgetConfig.newInstance();
widgetConfig.setPage(MRGSMyGamesSupportWidgetPage.FEEDBACK);
MRGSMyGamesSupport.getInstance().show(activity, widgetConfig, new Consumer<MRGSError>() {
@Override
public void accept(@Nullable MRGSError error) {
// Handle result here
}
});
Шаг 3.4 Открытие виджета поддержки🔗
После установки параметров, нужно вызвать метод показа:
Процесс открытия окна поддержки представлен ниже:
import androidx.annotation.Nullable;
import games.my.mrgs.MRGSError;
import games.my.mrgs.support.MRGSMyGamesSupport;
import games.my.mrgs.utils.optional.Consumer;
MRGSMyGamesSupport.getInstance().show(activity, widgetConfig, new Consumer<MRGSError>() {
@Override
public void accept(@Nullable MRGSError error) {
// Handle result here.
}
});
Статистика
MRGS автоматически собирает статистику по ошибкам в виджете с помощью MRGSMetrics (метрика -18)
Шаг 4. Проверка ответов от службы поддержки MyGamesSupport🔗
Только при работе через MRGS
При получении кода авторизации виджета самостоятельно функционал проверки ответов от службы поддержки недоступен.
Процесс проверки ответов на вопросы пользователя представлен ниже:
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import games.my.mrgs.MRGSError;
import games.my.mrgs.support.MRGSMyGamesSupport;
import games.my.mrgs.utils.optional.BiConsumer;
MRGSMyGamesSupport.getInstance().checkTickets(new BiConsumer<Integer, MRGSError>() {
@Override
public void accept(@NonNull Integer integer, @Nullable MRGSError error) {
// Handle result here.
}
});
Шаг 5. Получение уведомлений об ответах службы поддержки🔗
В случае, если у вас интегрирован наш модуль уведомлений, пользователю будут приходит уведомления об ответах поддержки. Для того, чтобы при нажатии на это уведомление пользователь попал в виджет поддержки на нужную страницу, необходимо установить делегат и открыть выбранную страницу в удобный момент времени:
private class NotificationSupportDelegate : MRGSMyGamesSupport.INotificationDelegate
{
public void OnReceiveShowIntent(MRGSMyGamesSupport.WidgetPage page)
{
var config = new MRGSMyGamesSupport.WidgetConfig()
{
Theme = MRGSMyGamesSupport.WidgetTheme.Dark,
Page = page
};
MRGSLog.Instance.AddLog("Opening support view with params:\n"+config);
MRGSMyGamesSupport.Instance.Show(config, error =>
{
MRGSLog.Instance.AddLog("Closed support view." + (error != null ? "With error - " + error : ""));
});
}
}
MRGSMyGamesSupport.Instance.NotificationDelegate = new NotificationSupportDelegate();
MRGSMyGamesSupportNotificationListener supportNotificationListener = new MRGSMyGamesSupportNotificationListener() {
@Override
public void onReceiveShowIntentForPage(@NonNull MRGSMyGamesSupportWidgetPage page) {
MRGSMyGamesSupportWidgetConfig config = MRGSMyGamesSupportWidgetConfig.newInstance();
config.setPage(page);
MRGSMyGamesSupport.getInstance().show(Activity.this, config);
}
};
MRGSMyGamesSupport.getInstance().setSupportNotificationListener(supportNotificationListener);
В случае, если у вас не интегрирован модуль уведомлений от MRGS - вы можете отлавливать такие уведомления самостоятельно, их формат указан ниже:
Где:
- "ref" - обязательный параметр, со значением "support".
- "url" - обязательный параметр, строка формата "/#/ticket/$ticket_number" в котором указан номер ticket.
Дата создания: 2020-02-10