Перейти к содержанию

Подключение поддержки уведомлений на клиенте🔗

Для интеграции уведомлений необходимо выполнить несколько простых шагов

Получение уведомлений🔗

Шаг 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-уведомлениями:

Notification setting 1

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

Notification setting 2

Или же это можно сделать в коде 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+):

if ('**APPLICATIONID**' == Your application package name)
{
    copy {
        from "./src/main/assets/"
        into "./"
        include 'google-services.json'
    }

    apply plugin: 'com.google.gms.google-services'
}
Как поместить agconnect-services.json в корень android проекта

По умолчанию Unity копирует все файлы из директории Assets Unity-проекта в директорию assets android-проекта. Для того, чтобы файл agconnect-services.json оказался в корне android-проекта, вы можете воспользоваться небольшим скриптом, добавленным в конец файла mainTemplate.gradle(Для Unity 2017/2018) или launcherTemplate.gradle(Для Unity 2019+):

if ('**APPLICATIONID**' == Your application package name)
{
    copy {
        from "./src/main/assets/"
        into "./"
        include 'agconnect-services.json'
    }

    apply plugin: 'com.huawei.agconnect'
}
Если Вы хотите использовать уведомления с локацией

Если Вы будете использовать локальные уведомления, основанные на геопозиции пользователя (для подробностей смотрите пункт MRGSNotificationTrigger), то в Info.plist Вашего приложения необходимо добавить поле NSLocationWhenInUseUsageDescription (Xcode отображает его как "Privacy - Location When In Use Usage Description"), в котором необходимо описать зачем Вам необходимо разрешение на использование локации, пример необходимой части Info.plist:

<key>NSLocationWhenInUseUsageDescription</key>
<string>Мы хотим присылать Вам уведомления, когда Вы подходите к своей базе!</string>

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 все сделает сам, а именно:

  1. Запросит разрешение на отправку уведомлений
  2. При соглашении пользователя мы отправим на сервер MRGS deviceToken для отправки push-уведомлений

Разрешение на показ уведомлений Android 13

На Android до версии Android 13 приложение может отображать уведомления без запроса разрешения пользователя. Начиная с версии Android 13 для этого понадобятся разрешения выданные пользователем (так же как на iOS).

Запрос разрешения позже

Если Вам необходимо запросить разрешение на уведомления не на старте, а позже или если Вы не ставили вышеупомянутые флаги, и хотите вручную провести данный процесс (регистрации), обратитесь к разделу Ручное управление регистрацией и запросом разрешения

Trial notifications (для iOS)

iOS позволяет присылать уведомления до разрешения их пользователем, которые затем можно разрешить или отказаться от них.

notifications-ios-trial-notifications

Если вы хотите использовать такой тип разрешений, ознакомьтесь с разделом Работа с 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;

При получении уведомления, или нажатии на него, будет вызван метод делегата:

void On(Local|Remote)NotificationReceive(MRGSNotification notification) //Получение
void On(Local|Remote)NotificationClick(MRGSNotification notification) //Нажатие

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. Создание🔗

Чтобы создать объект уведомления, воспользуйтесь методом:

MRGSNotification.Create(identifier: 777); //Уникальный идентификатор уведомления

Важно!

При создании уведомления идентификатор - это число типа 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 поля по умолчанию:

  1. Поле sound = "default" - стандартный звук уведомлений
  2. Поле badge = 1

Шаг 2. Правила срабатывания🔗

MRGSNotificationTrigger - это класс для установки или определения правил срабатывания уведомлений. Он может быть четырех типов:

  1. TimeInterval - Триггер с заданным интервалом времени (Сработает через X секунд).
  2. DateComponents - Триггер с заданными правилами даты (Например, 15 день месяца, 15 часов 17 минут (Тогда триггер сработает в ближайшие 15 часов 15 минут по местному времени.)). (по Local time!)
  3. Location - Триггер, основанный на локации пользователя. (только для iOS)
  4. 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.Add(notification);

Пример🔗

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 позволяет Вам работать со всеми функциями и новшествами в уведомлениях, а именно:

  1. Запрашивать разрешение на отправку уведомлений в нужное вам время (для iOS)
  2. Получить настройки уведомлений пользователя
  3. Работать с доставленными и запланированными уведомлениями
  4. Добавлять в уведомления кнопки и кастомизировать их вид.
  5. Настраивать группировку уведомлений, включая вид summary и его аргументы.
  6. Добавлять вложения к уведомлениям.
  7. Добавлять собственные звуки к уведомлениям.
  8. Удобно включать и выключать уведомления на клиенте одним методом, а мы позаботимся об отмене уведомлений или инвалидации токена (полезно для проектов, где в настройках есть переключатель доступности уведомлений)
  9. Выставлять номер на иконке приложения на iOS.
  10. Работать с Trial notifications на iOS.

Для просмотра документации по данным функциями, перейдите в следующий раздел - кастомизация и дополнительные возможности


Последнее обновление: 2025-01-21
Дата создания: 2020-01-20