Подключение поддержки уведомлений на клиенте🔗
Для интеграции уведомлений необходимо выполнить несколько простых шагов
Получение уведомлений🔗
Шаг 1. Импортируйте модуль уведомлений и добавьте разрешения🔗
- Добавьте SDK в проект:
Шаг 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, выберите пакетMRGSNotificationsиз списка, затем нажмите "Install" - Импортируйте модуль:
using MRGS;
- Загрузите последнюю версию библиотеки. Распакуйте архив.
- (Для интеграции unitypackage) В Unity нажмите
Assets -> Import Package -> Custom Package, и выберите пакетgames.my.mrgs.notifications.unitypackageиз скачанного архива. - (Для интеграции tgz) В Unity нажмите
Window -> Package Manager -> '+' -> Add package from tarball, и выберите пакетgames.my.mrgs.notifications-<version>.tgzиз скачанного архива. - Импортируйте модуль:
using MRGS;
- Для подключения серверных нотификаций на iOS убедитесь, что в админке вашего приложения на сайте MRGS добавлены сертификаты для Developer и Release сборок вашего приложения.
- Для подключения серверных нотификаций на Android убедитесь, что в админке вашего приложения на сайте MRGS прописан ключ для отправки нотификаций
- Для Android следуйте документации по подключению Firebase к вашему проекту, полученный google-services.json файл должен лежать в корне собираемого android приложения.
- Для Huawei/AppTouch Store следуйте документации по подключению Huawei Push Kit к вашему проекту, полученный agconnect-services.json файл должен лежать в корне собираемого android приложения.
- Для iOS если вы хотите поддержки push-уведомлений, то необходимо в настройках проекта в XCode добавить необходимые разрешения на работу с ними:
Как в настройках проекта в XCode добавить необходимые разрешения
Разрешение на работу с push-уведомлениями:

И SilentPush-уведомлениями:

Или же это можно сделать в коде Unity-проекта в PostProcessBuild:
public class PostBuildProcessSample
{
[PostProcessBuild]
public static void PostProcessBuild(BuildTarget target, string path)
{
if (target == BuildTarget.iOS)
{
#if UNITY_IOS
string projPath = PBXProject.GetPBXProjectPath(path);
PBXProject proj = new PBXProject();
proj.ReadFromString(File.ReadAllText(projPath));
#if UNITY_2019_3_OR_NEWER
string projectTarget = proj.GetUnityMainTargetGuid();
#else
string targetName = PBXProject.GetUnityTargetName();
string projectTarget = proj.TargetGuidByName(targetName);
#endif
//Adding capabilities
#if UNITY_2019_3_OR_NEWER
ProjectCapabilityManager projectManager = new ProjectCapabilityManager(projPath, "ios.entitlements", targetGuid: projectTarget);
#else
ProjectCapabilityManager projectManager = new ProjectCapabilityManager(projPath, "ios.entitlements", targetName);
#endif
projectManager.AddPushNotifications(development: true);
projectManager.AddBackgroundModes(options: BackgroundModesOptions.RemoteNotifications);
projectManager.WriteToFile();
#endif
}
}
}
Как поместить google-services.json в корень android проекта
По умолчанию Unity копирует все файлы из директории Assets Unity-проекта в директорию assets android-проекта. Для того, чтобы файл google-services.json оказался в корне android-проекта, вы можете воспользоваться небольшим скриптом, добавленным в конец файла mainTemplate.gradle(Для Unity 2017/2018) или launcherTemplate.gradle(Для Unity 2019+):
Как поместить agconnect-services.json в корень android проекта
По умолчанию Unity копирует все файлы из директории Assets Unity-проекта в директорию assets android-проекта. Для того, чтобы файл agconnect-services.json оказался в корне android-проекта, вы можете воспользоваться небольшим скриптом, добавленным в конец файла mainTemplate.gradle(Для Unity 2017/2018) или launcherTemplate.gradle(Для Unity 2019+):
Если Вы хотите использовать уведомления с локацией
Если Вы будете использовать локальные уведомления, основанные на геопозиции пользователя (для подробностей смотрите пункт MRGSNotificationTrigger), то в Info.plist Вашего приложения необходимо добавить поле NSLocationWhenInUseUsageDescription (Xcode отображает его как "Privacy - Location When In Use Usage Description"), в котором необходимо описать зачем Вам необходимо разрешение на использование локации, пример необходимой части Info.plist:
FirebaseMessaging.unitypackage может перехватывать уведомления от MRGS, что приведет к тому что вы не будете видеть уведомления.
Шаг 2. Настройка параметров🔗
При старте SDK MRGS необходимо добавить установку настроек уведомлений:
using MRGS;
public class MasterController : MonoBehaviour
{
void Awake()
{
MRGServiceParams serviceParams = new MRGServiceParams(MRGS_APP_ID, CLIENT_SECRET);
serviceParams.IOSExtraOptions.AllowPushNotifications = true; // Enabling notifications
serviceParams.IOSExtraOptions.ShouldResetBadge = true; // Reset the number on the icon when opening from background
// Further setup and initialization of MRGS
// ...
}
}
Флаг ShouldResetBadge необходимо выставить в true, если Вы хотите, чтобы MRGS работал с номером на иконке приложения в iOS - при запуске приложения номер на иконке будет обнуляться.
Далее после старта SDK, MRGS все сделает сам, а именно:
- Запросит разрешение на отправку уведомлений
- При соглашении пользователя мы отправим на сервер MRGS deviceToken для отправки push-уведомлений
Разрешение на показ уведомлений Android 13
На Android до версии Android 13 приложение может отображать уведомления без запроса разрешения пользователя. Начиная с версии Android 13 для этого понадобятся разрешения выданные пользователем (так же как на iOS).
Запрос разрешения позже
Если Вам необходимо запросить разрешение на уведомления не на старте, а позже или если Вы не ставили вышеупомянутые флаги, и хотите вручную провести данный процесс (регистрации), обратитесь к разделу Ручное управление регистрацией и запросом разрешения
Trial notifications (для iOS)
iOS позволяет присылать уведомления до разрешения их пользователем, которые затем можно разрешить или отказаться от них.

Если вы хотите использовать такой тип разрешений, ознакомьтесь с разделом Работа с Trial (Provisional) Notifications на iOS
Запрос не всех разрешений (для iOS) (например, только баннеры, исключив звуки и бейджи)
По дефолту мы запросим все доступные разрешения: звуки, баннеры, бейдж на иконке. В случае, если вы хотите запросить только часть из них (например, вы можете запросить только алерты и бейджи, исключив звук), то можете воспользоваться методом ExcludePermissionsForNotificationsAuthorizationRequest. Данный метод должен быть вызван до инициализации MRGS при каждом запуске, рекомендуем вызывать его в момент установки параметров для старта MRGS. Пример:
// MRGService settings
MRGServiceParams serviceParams = new MRGServiceParams(MRGS_APP_ID, CLIENT_SECRET);
// ...
// Исключение бейджей на иконке и звука, останутся только баннеры
MRGSNotificationCenter.ExcludePermissionsForNotificationsAuthorizationRequest(MRGSNotificationAuthorizationOptionType.Badge | MRGSNotificationAuthorizationOptionType.Sound);
// Дальнейшая настройка и инициализация MRGS
// ...
Можно оставить только трекинг
Даже если Вы не хотите работать с уведомлениями с помощью MRGS, Вы можете отметить вышеупомянутые флаги в TRUE, MRGS просто будет наблюдать за приходом уведомлений и отправлять статистику на сервер. Единственное условие для такой "не мешающей и тихой" работы - на IOS 10+ Вами должен использоваться новый UNUserNotificationCenter, иначе, мы можем подписаться на его делегат, и уведомления о приходе уведомлений не будут доходить до старого делегата.
Шаг 3. Настройка делегата🔗
3.1. Делегат получения уведомлений🔗
Для получения callback'a о приходе уведомления, или о нажатии по нему, необходимо установить и реализовать делегат типа IMRGSNotificationCenterDelegate.
// Setting a generic delegate without splitting by the type of notifications received (local or push)
// 'this' conforms to 'IMRGSNotificationCenterDelegate' protocol
MRGSNotificationCenter.Instance.Delegate = this;
При получении уведомления, или нажатии на него, будет вызван метод делегата:
void OnNotificationReceive(MRGSNotification notification) { //Получение
}
void OnNotificationClick(MRGSNotification notification) { //Нажатие
}
Вы можете узнать тип полученного уведомления с помощью параметра
notification.Trigger.TriggerType, о котором будет сказано ниже.
Что делать, если мы хотим раздельные делегаты для локальных и серверных уведомлений?
Такая возможность у нас есть. В таком случае Вам необходимо установить и реализовать делегаты типа IMRGSNotificationCenterLocalDelegate, IMRGSNotificationCenterRemoteDelegate.
// Setting a separated delegate with a breakdown by the type of notifications received (separately local, separately push)
// 'this' conforms to 'IMRGSNotificationCenterRemoteDelegate' protocol
MRGSNotificationCenter.Instance.RemoteDelegate = this;
// 'this' conforms to 'IMRGSNotificationCenterLocalDelegate' protocol
MRGSNotificationCenter.Instance.LocalDelegate = this;
При получении уведомления, или нажатии на него, будет вызван метод делегата:
3.2. Делегат разрешения уведомлений (на iOS)🔗
Если Вы хотите получить callback в момент, когда пользователь нажал кнопку "Разрешить уведомления", с данными о его решении, то воспользуйтесь делегатом IMRGSNotificationCenterAuthorizationDelegate. Делегат необходимо выставить как можно раньше.
Пример:
// Setting delegate
// 'this' conforms to 'IMRGSNotificationCenterAuthorizationDelegate' protocol
MRGSNotificationCenter.Instance.AuthorizationDelegate = this;
// Recieving callback
public void OnRequestUserNotificationsAuthorizationWithResult(bool granted)
{
string isGranted = granted ? "granted" : "not granted";
Debug.Log("Received callback that user has " + isGranted + " access to notifications" );
}
Работа с уведомлениями🔗
Основной объект, описывающий уведомление - MRGSNotification. Необходим для отправки локальных уведомлений, а также описывает полученное уведомление (как push, так и локальное).
Важно
Прежде чем работать с MRGSNotifications модулем, нужно инициализировать MRGService.
Шаг 1. Создание🔗
Чтобы создать объект уведомления, воспользуйтесь методом:
Важно!
При создании уведомления идентификатор - это число типа int, но само поле идентификатора является типом string. Как такое могло получиться? Все просто: на Android уведомления имеют int id, а на iOS - string. Поэтому при приходе серверного push-уведомления на iOS, его идентификатор будет string-типа. Поэтому при создании Вы пользуетесь int идентификатором уведомления, но при чтении будете получать string.
Затем необходимо настроить уведомление:
notification.Title = "Hello"; //Заголовок уведомления
notification.Subtitle = "Sub_Hello"; //Подзаголовок уведомления. (Только для iOS)
notification.Body = "From Unity"; //Тело уведомления. (Основной текст уведомления.)
notification.Sound = "soundFile.caf"; //Кастомный звук
//Дополнительная информация, добавляемая к уведомлению. (Для Push-уведомлении в данном поле находится payload)
notification.DeveloperPayload = new Dictionary<string,object>();
notification.DeveloperPayload["someInfoKey"] = "someImportantInfo";
//Настраиваем правило срабатывания
//В данном случае уведомление будет показано через 7 секунд.
notification.Trigger = MRGSNotificationTrigger.TriggerWithTimeInterval(timeInterval: 7, repeats: false);
Мы также предоставляем возможность "быстрого" создания объектов уведомлений, вы можете воспользоваться быстрым созданием уведомления с помощью методов:
MRGSNotification.Create(title: "_", body: "_", identifier: 1123, timeInterval: 7); //Сработает через 7 секунд
MRGSNotification.Create(title: "_", body: "_", identifier: 1123, trigger: TRIGGER); //где TRIGGER - объект класса MRGSNotificationTrigger
MRGSNotification.Create(title: "_", body: "_", identifier: 1123, date: DATE); //где DATE - объект класса DateTime в UTC
Значения по умолчанию
При создании объекта MRGSNotification поля по умолчанию:
- Поле sound = "default" - стандартный звук уведомлений
- Поле badge = 1
Шаг 2. Правила срабатывания🔗
MRGSNotificationTrigger - это класс для установки или определения правил срабатывания уведомлений. Он может быть четырех типов:
TimeInterval- Триггер с заданным интервалом времени (Сработает через X секунд).DateComponents- Триггер с заданными правилами даты (Например, 15 день месяца, 15 часов 17 минут (Тогда триггер сработает в ближайшие 15 часов 15 минут по местному времени.)). (по Local time!)Location- Триггер, основанный на локации пользователя. (только для iOS)Remote- Триггер, говорящий о том, что уведомление является push-уведомлением.
Для создания выбранного триггера (кроме Remote, он создается MRGS при получении уведомления) воспользуйтесь методом:
//Создание TimeInterval триггера
MRGSNotificationTrigger* trigger = MRGSNotificationTrigger.TriggerWithTimeInterval(timeInterval: 70, repeats: false) //Сработает через 70 секунд.
//Создание DateComponents триггера
MRGSNotificationTrigger.MRGSDateComponents components = new MRGSNotificationTrigger.MRGSDateComponents();
components.Minute = 30;
components.Hour = 5;
components.Day = 15;
MRGSNotificationTrigger* trigger = MRGSNotificationTrigger.TriggerWithDateComponents(dateComponents: components, repeats: false); //Сработает ближайшего 15 числа в 5 часов 30 минут. (по Local time!)
//Создание Location триггера
MRGSNotificationTrigger.MRGSLocation location = MRGSNotificationTrigger.MRGSLocation.Create(centerX: 1.32f, centerY: 1.325f, radius: 100.345f);
MRGSNotificationTrigger locationTrigger = MRGSNotificationTrigger.TriggerWithLocation(location: location, notifyOnEntry: true, notifyOnExit: true, repeats: false); //Сработает на входе и выходе из указанной области.
Кроме того, параметр repeats: при создании говорит о том, будет ли триггер повторяемый (например повторяться каждые 70 секунд, каждый день в 13.00, срабатывать каждый раз при входе в указанную локацию). (только для iOS)
Не забудьте отключить повтор
Иначе уведомления будут приходить бесконечно долго, пока установлено Ваше уведомление. На IOS 9 уведомления повторятся максимум десять раз, после этого нужно будет вновь добавить уведомление в очередь. При использовании TimeInterval триггера минимальный интервал для использования повторений должен быть 60 секунд.
Триггер в пришедшем уведомлении будет содержать поле TriggerType, из которого можно понять, является ли данное уведомление локальным или удаленным, а также будет содержать соответствующие поля, содержащие данные для каждого типа триггера (интервал, или компоненты даты, или локацию).
Также можно воспользоваться созданием триггера на определенную дату в формате DateTime или long (для unixTime):
MRGSNotificationTrigger* trigger = MRGSNotificationTrigger.TriggerWithDate(DateTime.UtcNow.AddDays(5)); //По UTC
MRGSNotificationTrigger* trigger = MRGSNotificationTrigger.TriggerWithUnixTime(1287623847623); //По UTC
Шаг 3. Отправка🔗
Для отправки уведомления воспользуйтесь методом:
Пример🔗
MRGSNotificationCenter.Instance.Delegate = this;
// Sending:
MRGSNotification notification = MRGSNotification.Create(title: "titleUnity", body: "bodyUnity", identifier: 1234, timeInterval: 7);
notification.DeveloperPayload = new Dictionary<string,object>();
notification.DeveloperPayload["unity1"] = "TESTUSERINFO";
notification.DeveloperPayload["unity2"] = 1;
notification.IosExtraOptions.ThreadIdentifier = "unityTheread1";
notification.IosExtraOptions.CategoryIdentifier = "categoryOnReturnNotifications";
notification.AndroidExtraOptions.GroupId = 3;
notification.AndroidExtraOptions.ChannelGroupId = "testChannel";
MRGSNotificationCenter.Instance.Add(notification);
// Receiving:
public void OnNotificationReceive(MRGSNotification notification)
{
bool isRemote = notification.Trigger.TriggerType == MRGSNotificationTrigger.Type.Remote;
Debug.Log("MRGSNotification received: " + notification);
Debug.Log("Remote: " + isRemote);
}
public void OnNotificationClick(MRGSNotification notification)
{
bool isRemote = notification.Trigger.TriggerType == MRGSNotificationTrigger.Type.Remote;
Debug.Log("MRGSNotification clicked: " + notification);
Debug.Log("Remote: " + isRemote);
}
Расширенная настройка уведомлений, дополнительные возможности🔗
MRGS позволяет Вам работать со всеми функциями и новшествами в уведомлениях, а именно:
- Запрашивать разрешение на отправку уведомлений в нужное вам время (для iOS)
- Получить настройки уведомлений пользователя
- Работать с доставленными и запланированными уведомлениями
- Добавлять в уведомления кнопки и кастомизировать их вид.
- Настраивать группировку уведомлений, включая вид summary и его аргументы.
- Добавлять вложения к уведомлениям.
- Добавлять собственные звуки к уведомлениям.
- Удобно включать и выключать уведомления на клиенте одним методом, а мы позаботимся об отмене уведомлений или инвалидации токена (полезно для проектов, где в настройках есть переключатель доступности уведомлений)
- Выставлять номер на иконке приложения на iOS.
- Работать с Trial notifications на iOS.
Для просмотра документации по данным функциями, перейдите в следующий раздел - кастомизация и дополнительные возможности
Дата создания: 2020-01-20