unity push-уведомления

Дин! Время просыпаться.
Дин! У вас назначена встреча через 30 минут.
Дин! Завтра день рождения твоей мамы.

Уведомления — привычная и ценная часть современной жизни, поэтому вполне естественно ожидать, что ваши любимые мобильные приложения и игры тоже будут их использовать. В этом руководстве вы узнаете о мобильных уведомлениях Unity и о том, как создавать и планировать свои собственные уведомления для приложения Unity, работающего на устройстве Android. Уведомления выведут ваши приложения на новый уровень, помогая вам удерживать внимание пользователей, а также информировать их.

Notifications on an Android device

Примечание. В этом руководстве предполагается, что вы знакомы с основами разработки Android в Unity. Если вы новичок в этой теме, сначала ознакомьтесь с нашей серией статей о Unity для начинающих. Для этого руководства вам понадобится Unity 2019.3.0f3 или более поздней версии. Убедитесь, что вы также установили поддержку сборки Android.

Начиная


Загрузите проект, нажав кнопку «Загрузить материалы» в верхней или нижней части руководства.

Откройте начальный проект и посмотрите на структуру папок в окне проекта.

Folder setup in the Project window

В Assets ► RW вы найдете все необходимое для проекта:

Сцены: содержит сцену NotificationTutorial.
Скрипты: пустая папка для скрипта, который вы создадите.
Текстуры: содержит образцы изображений, которые вы можете использовать.
Префабы: пример интерфейса для использования.
Взгляните на сцену NotificationTutorial в папке Scenes. Вы заметите, что это просто пустая сцена, в которой ничего особенного не происходит. Он представляет собой типичное приложение Unity без возможностей уведомлений. В следующих шагах вы добавите некоторые основные элементы пользовательского интерфейса, а также необходимые компоненты и сценарии, чтобы это приложение Unity могло отправлять уведомления.

Теперь вы готовы к тому, чтобы вас заметили! :]

Настройка сцены
Поскольку это руководство по Android, убедитесь, что вы выбрали Android в качестве платформы в настройках сборки. Откройте диспетчер пакетов, и вы увидите, что TextMeshPro и мобильные уведомления уже импортированы.

The Package Manager's setup

Откройте сцену NotificationTutorial в папке «Scenes». Вы найдете очень простую сцену с камерой, холстом наложения экрана и системой событий. Установите режим просмотра «Game view» на «Portrait », чтобы он соответствовал ориентации по умолчанию, настроенной в  Project Settings ► Player.

Начните с создания заголовка для главной страницы. Выберите Canvas в Hierarchy, добавьте UI ► Text — TextMeshPro GameObject и назовите его Title. Дайте текстовому полю броское имя: Учебник по нотации.

Создайте пустой GameObject под Canvas, чтобы удерживать несколько кнопок. Назовите его ButtonGroup и добавьте компонент Horizontal Layout Group, чтобы настроить макет по своему усмотрению. Вы также можете настроить RectTransform в соответствии со своими предпочтениями.

Затем создайте две кнопки, выбрав ButtonGroup в Hierarchy, а затем щелкнув правой кнопкой мыши, чтобы выбрать UI ► Button-TextMeshPro.

Вы будете использовать первую кнопку для отправки одного уведомления после небольшой задержки, поэтому назовите ее ShortNote. Установите текст для уведомления через 10 секунд.

Вы будете использовать вторую кнопку, чтобы запланировать одно уведомление после долгой задержки, поэтому назовите ее LongNote. Установите текст для уведомления через одну минуту.

Если вы не хотите настраивать это самостоятельно, есть готовый префаб, который можно импортировать в RW ► Prefabs.

Notifications Tutorial with two buttons set up

Пользовательский интерфейс завершен. Прежде чем внедрять определенные уведомления, подумайте, почему уведомления важны для вашего приложения.

Использование уведомлений для улучшения удержания
Одним из основных преимуществ уведомлений является их положительное влияние на удержание игроков. Уведомления помогают игрокам вернуться к игре, в которую они давно не играли. Эти ошибки игрока часто устраняются в течение 3-дневного, 7-дневного или 30-дневного цикла с момента последнего активного сеанса игрока.

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

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

Все эти примеры являются вескими причинами для игрока вернуться в игру, и уведомления — отличный способ напомнить игрокам об этих причинах.

Понимание уведомлений


Само уведомление состоит из пяти частей, которые вам необходимо создать и предоставить:

  1. Title: короткий текст, выделенный жирным шрифтом.
  2. Description: более длинный текст, не выделенный полужирным шрифтом.
  3. Small icon. Небольшая чисто белая иконка, которая отображается в пользовательском интерфейсе устройства.
  4. Large icon большой цветной значок, который появляется только при наличии свободного места в пользовательском интерфейсе.
  5. Delivery date: дата и время, когда приложение должно уведомить пользователя.

Как разработчик приложения, вы не контролируете пользовательский интерфейс устройства или то, как пользователь взаимодействует с уведомлением — это работа ОС устройства. Ваша задача состоит в том, чтобы предоставить все пять частей уведомления, чтобы операционная система устройства могла правильно отправить сообщение в соответствии с различными пользовательскими сценариями.

Теперь, когда у вас есть представление о структуре уведомлений, пришло время подготовить ваши активы к работе.

Подготовка ассетов


Чтобы добиться наилучшего эффекта, ваши уведомления должны быть не только своевременными, но и привлекательными. Для этого вам понадобятся арты.

Пакет мобильных уведомлений Unity предоставляет простой способ управления художественными активами, которые необходимо создать для уведомлений. В этом руководстве используется предварительная версия пакета мобильных уведомлений 5–1.0.4 из диспетчера пакетов Unity. Вы можете найти настройки мобильных уведомлений в настройках проекта.

Ваш первый шаг — настроить три значка:

  1. Для значка идентификатора-0 с типом маленького значка выберите ресурс icon_timer.
  2. Затем для Identifier icon_1, который имеет Type Large Icon, выберите ресурс RW_Icon_macOS_256.
  3. Наконец, для будильника с идентификатором с типом маленького значка выберите ресурс icon_notification_bell.

Эти идентификаторы должны соответствовать сценарию, который вы создадите дальше. Диалог настроек должен выглядеть так:

Mobile Notifications Settings screen

Сцене также нужен способ обработки уведомлений.

Чтобы настроить их, создайте пустой GameObject с именем NotificationManager. Иерархия сцены теперь должна выглядеть так:

Current screen hierarchy

254 / 5 000

Результаты перевода

Выберите этот GameObject и добавьте компонент Game Notifications Manager, который поставляется с пакетом мобильных уведомлений.

Внутри скрипта создайте новый скрипт C# с именем NotificationManager. Прикрепите этот скрипт к игровому объекту NotificationManager.

Notifications Manager setup

Now that all the pieces are in place, it is time to connect them.

Инициализация системы

Следующим вашим шагом будет настройка вашей системы для отправки уведомлений путем добавления некоторых важных функций и объявлений».

Для начала откройте сценарий Notification Manager в своем любимом редакторе кода и добавьте следующие объявления в сценарий над объявлением класса:


using System;	//for DateTime
using NotificationSamples;
  1. Работа со временем является важной частью управления уведомлениями, а функции DateTime в System предоставляют множество полезных ярлыков.
  2. NotificationSamples предоставляет доступ к MobileNotifications API.

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

private GameNotificationsManager manager;

public const string ChannelId = "game_channel0";

public const string ReminderChannelId = "reminder_channel1";

public const string NewsChannelId = "news_channel2"; 
  1. Создайте частную ссылку на класс GameNotificationsManager, которую можно будет использовать во всем сценарии.
  2. Объявите переменную ChannelId и установите для нее значение «game_channel0».
  3. Объявите переменную ReminderChannelId и установите для нее значение «reminder_channel1».
  4. Объявите переменную NewsChannelId и установите для нее значение «news_channel2».

Каналы определены как глобальные константы, поэтому другие скрипты могут ссылаться на них при setting/sending уведомлений.

Затем вы будете использовать функцию Awake , чтобы указать ссылку на Game Notifications Manager по умолчанию:

void Awake() 
{
    manager = GetComponent<GameNotificationsManager>();
}

Вам также необходимо настроить каналы (в основном для Android) с помощью следующего кода в «Start»:

void Start()
{
    
void Start() {
  var c1 = new GameNotificationChannel(ChannelId, "Game Alerts", "Game notifications");
  var c2 = new GameNotificationChannel(NewsChannelId, "News", "News and Events");
  var c3 = new GameNotificationChannel(ReminderChannelId,
    "Reminders", "Reminders");
  manager.Initialize(c1, c2, c3);
}

Каждый GameNotificationChannel принимает три параметра: идентификатор, который вы создали ранее, короткий заголовок и длинный заголовок.

  1. Объявите новую переменную GameNotificationChannel c1 и установите для нее значение ChannelId с коротким заголовком «Game Alerts» и длинным заголовком «Game notifications».
  2. Объявите новую переменную GameNotificationChannel c2 и установите для нее значение NewsChannelId с коротким заголовком «News» и длинным заголовком «News and Events».
  3. Объявите новую переменную GameNotificationChannel c3 и установите для нее значение ReminderChannelId с коротким заголовком «Reminders» и длинным заголовком «Reminders».
  4. Теперь вызовите функцию Initialize, передав каналы, которые вы только что объявили.

Отправка уведомления вручную

Ядром системы является общий метод постановки уведомления в очередь с заданным набором параметров.

Добавьте эту функцию в скрипт диспетчера уведомлений.

public void SendNotification(string title, string body, DateTime deliveryTime,
  int ? badgeNumber = null, bool reschedule = false, string channelId = null,
  string smallIcon = null, string largeIcon = null) {
  IGameNotification notification = manager.CreateNotification();

  if (notification == null) {
    return;
  }

  notification.Title = title;

  notification.Body = body;

  notification.Group = !string.IsNullOrEmpty(channelId) ? channelId : ChannelId;

  notification.DeliveryTime = deliveryTime;

  notification.SmallIcon = smallIcon;

  notification.LargeIcon = largeIcon;

  if (badgeNumber != null) {
    notification.BadgeNumber = badgeNumber;
  }

  PendingNotification notificationToDisplay =
    manager.ScheduleNotification(notification);

  notificationToDisplay.Reschedule = reschedule;
}

Хотя это может показаться длинным и сложным сценарием, на самом деле это всего лишь способ обработки пяти обязательных компонентов уведомления. Он выполняет несколько проверок безопасности и упорядочивает информацию для передачи в Mobile Notifications Package перед ее отправкой в пользовательский интерфейс локального устройства.

  1. Объявите новый метод SendNotification, который принимает 8 параметров. Каждый из них будет описан ниже.
  2. Объявите новое уведомление переменной IGameNotification с помощью менеджера методов API.CreateNotification() manager.CreateNotification().
  3. Добавьте проверку безопасности, если API недоступен для досрочного выхода.
  4. Задайте заголовок для уведомления, установив переменную notification.Title в параметр title.
  5. Установите основной текст для уведомления, задав для переменной notification.Body параметр body.
  6. Если был передан идентификатор канала, используйте его для установки переменной notification.Group, в противном случае используйте ChannelId  по умолчанию, который был установлен ранее.
  7. Установите время доставки уведомления, задав для переменной notification.DeliveryTime значение параметра deliveryTime.
  8. Задайте для переменной notification.SmallIcon параметр smallIcon.
  9. Задайте для переменной notification.LargeIcon значение параметра largeIcon.
  10. При необходимости номер значка можно настроить для отображения на значке приложения, если передан badgeNumber , назначив его переменной notification.BadgeNumber.
  11. Теперь, когда все возможные параметры назначены, объявите новую переменную PendingNotification notificationToDisplay, используя метод API manager.ScheduleNotification(), и передайте уведомление.
  12. Наконец, передайте необязательный параметр reschedule bool в notificationToDisplay.Reschedule.

Теперь, когда у вас есть общий способ отправки уведомления, пришло время создать конкретные реализации, подключающиеся к кнопкам пользовательского интерфейса. Вставьте этот код внизу скрипта.

#region UI buttons

private string smallIconName = "icon_0";
private string largeIconName = "icon_1";

#endregion

Это создает UI Buttons пользовательского интерфейса в сценарии и устанавливает соответствующие ссылки на ассеты, выбранные вами в настройках мобильных уведомлений.

Реализация ShortNote

Во-первых, вы создадите ShortNote, который быстро отправляет уведомление после того, как пользователь нажмет кнопку.

Чтобы реализовать эту функцию, добавьте этот код в область кнопок пользовательского интерфейса:

private double shortDelay = 10;

public void ShortNote() {
  string title = "Thanks for playing!";
  string body = "Hope you had fun!";
  DateTime deliverTime = DateTime.UtcNow.AddSeconds(shortDelay);
  string channel = ChannelId;
  SendNotification(title, body, deliverTime, channelId: channel,
    smallIcon: smallIconName, largeIcon: largeIconName);
}
  1. Объявите переменную shortDelay и установите для нее значение 10. Это количество секунд ожидания перед отправкой уведомления.
  2. Объявите переменную title и установите для нее значение «Спасибо за игру!».
  3. Объявите переменную body и установите для нее значение «Надеюсь, вам было весело!».
  4. Объявите переменную deliveryTime, передав shortDelay в DateTime.UtcNow.AddSeconds.
  5. Объявите переменный channel и установите для него значение ChannelId.
  6. Затем все необходимые входные данные отправляются в общий SendNotification для обработки.

Реализация LongNote

Реализация LongNote выглядит очень похожей, за исключением того, что она позволяет вносить незначительные изменения в синхронизацию и обмен сообщениями.

Также добавьте этот код в область кнопок пользовательского интерфейса :

private double shortDelay = 10;

public void ShortNote() {
  string title = "Thanks for playing!";

  string body = "Hope you had fun!";

  DateTime deliverTime = DateTime.UtcNow.AddSeconds(shortDelay);

  string channel = ChannelId;

  SendNotification(title, body, deliverTime, channelId: channel,
    smallIcon: smallIconName, largeIcon: largeIconName);
}
  1. Объявите переменную longDelayи установите для нее значение 60 . Это количество секунд ожидания перед отправкой уведомления.
  2. Объявите переменную titleи установите для нее значение «Играть снова в ближайшее время!» .
  3. Объявите переменную bodyи установите для нее значение «Мы скучаем по тебе!» .
  4. Объявите переменную deliverTime, перейдя longDelayк DateTime.UtcNow.AddSeconds.
  5. Объявите переменную channelи присвойте ей значение ChannelId.
  6. Затем все необходимые входные данные отправляются в дженерик SendNotificationдля обработки.

Сохраните скрипт и вернитесь в редактор. Теперь, когда базовый код существует, пришло время подключить его к кнопкам пользовательского интерфейса.

Настройка UI Buttons

В Hierarchy выберите компонент Button игрового объекта ShortNote , создайте новое событие OnClick , нажав кнопку + в правом нижнем углу, и перетащите игровой объект NotificationManager в только что созданный слот OnClick . В раскрывающемся списке выберите NotificationManager.ShortNote .

Setting up the ShortNote

Повторите этот шаг для игрового объекта LongNote , назначив NotificationManager.LongNote .

Сохраните сцену и проект. Вы готовы развернуть сборку на своем устройстве Android.

Протестируйте, нажимая новые кнопки и ожидая появления уведомлений. Попробуйте с открытым и закрытым приложением. Уведомления должны по-прежнему появляться по расписанию.

Уведомления успешно поступают на устройство

Поздравляем, вы освоили основы уведомлений. Далее пришло время для чего-то более продвинутого.

Планирование группы уведомлений

Напоминания об удержании и запланированные события — это мощные формы уведомлений, которые немного отличаются от основного формата задержки.

Напоминания об удержании

У вас должна быть возможность отменить напоминания об удержании, если игрок вернется до того, как они появятся. Например, обычным подходом является напоминание игроку вернуться через 3, 7 и 30 дней после его последнего сеанса.

Если игрок не вернется, он получит три уведомления на 3-й, 7-й и 30-й день. Но представьте, что они возвращаются на 5-й день. Ранее запланированные напоминания на 7-й и 30-й день необходимо отменить. И все три дня напоминания должны быть сброшены с новой текущей даты воспроизведения.

Чтобы создать напоминания об удержании, добавьте в Notification Manager следующий код :

private string retentionIconName = "icon_0";
private string retentionLargeIconName = "icon_1";

//Schedule notification relative to current game session
//Change this from seconds to days after testing
private void RetentionReminderTest(int seconds) {
  string title = "We miss you!";
  string body = string.Concat("You've been away for ", seconds, " seconds");
  DateTime deliverTime = DateTime.UtcNow.AddSeconds(seconds);
  string channel = ReminderChannelId;

  SendNotification(title, body, deliverTime, channelId: channel,
    smallIcon: retentionIconName, largeIcon: retentionLargeIconName);
}

Если вы думаете, что это очень похоже на оба ShortNoteи LongNote, вы правы! Это просто общая форма, которая принимает время ожидания в качестве параметра. Таким образом, вы можете вызывать его с любым количеством времени, которое вам нужно.

Запланированные мероприятия

Запланированные события должны происходить в определенную дату и время, независимо от того, когда игрок в последний раз использовал приложение. Может быть, есть повторяющееся событие 15-го числа каждого месяца или разовое мероприятие, запланированное на определенный праздник, например, День матери. DateTime.UtcNow.AddSecondsне помогает в этом сценарии, поэтому вам нужно создать другую конкретную функцию для планирования этих уведомлений, добавив следующий код в  Notification Manager :

private string eventIconName = "alarm";
private string eventLargeIconName = "icon_1";

//Schedule notification to a specific DateTime
//Change this from minutes to a specific DateTime or daysOfTheMonth
private void EventAlarmTest(int minutesOnTheHour) {
  string title = "Event is Starting!";
  string body = string.Concat("It's ", minutesOnTheHour, " minutes after the hour");
  DateTime deliverTime = GetNextEvent(minutesOnTheHour);
  string channel = ChannelId;

  SendNotification(title, body, deliverTime, channelId: channel,
    smallIcon: eventIconName, largeIcon: eventLargeIconName);
}

private DateTime GetNextEvent(int minutesOnTheHour) {
  DateTime temp = DateTime.Now;

  temp = new DateTime(temp.Year, temp.Month, temp.Day,
    temp.Hour, minutesOnTheHour, 0);

  return temp;
}

Он имеет аналогичную структуру, но использует другой значок из Mobile Notification Settings . У него также есть помощник для помощника: GetNextEvent, который помогает преобразовать количество времени, которое вы хотите ждать, в определенный DateTimeформат, который вам нужно отправить в SendNotification.

Вы можете разработать аналогичные функции, которые помогут вам реализовать любой тип планирования уведомлений, который вам нужен.

Начиная с чистого листа

Есть пара последних кусочков, чтобы собрать всю головоломку.

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

void ScheduleCurrentNotifications() {
  RetentionReminderTest(30);
  RetentionReminderTest(70);
  RetentionReminderTest(100);
  EventAlarmTest(DateTime.Now.Minute + 2);
  EventAlarmTest(DateTime.Now.Minute + 3);
}
  1. Запланируйте напоминание об удержании на 30 секунд
  2. Запланируйте еще одно напоминание об удержании на 70 секунд.
  3. Запланируйте третье напоминание об удержании на 100 секунд.
  4. Запланируйте конкретное событие на 2 минуты в будущем
  5. Запланируйте другое конкретное событие на 3 минуты в будущем

Существует множество сценариев, в которых запланированные уведомления необходимо заменить или обновить. Добавьте шаг в системный поток, который удаляет все ранее запланированные уведомления. Каждый раз, когда игрок запускает приложение, ранее запланированные уведомления должны отбрасываться и заменяться новым набором уведомлений, запланированных на текущую дату игры.

Чтобы реализовать эту функцию, добавьте эту строку в раздел « Start » в Notification Manager :

manager.Platform.CancelAllScheduledNotifications();

Это было легко.

Наконец, вызовите функцию ScheduleCurrentNotifications в нижней части Start  в Notification Manager . Полная функция Start должна выглядеть так:

void Start()
{
    var c1 = new GameNotificationChannel(ChannelId, "Game Alerts", "Game notifications");
    var c2 = new GameNotificationChannel(NewsChannelId, "News", "News and Events");
    var c3 = new GameNotificationChannel(ReminderChannelId, 
        "Reminders", "Reminder notifications");

    manager.Initialize(c1, c2, c3);

    manager.Platform.CancelAllScheduledNotifications();

    ScheduleCurrentNotifications();
}

Сохраните сценарий NotificationManager — теперь он завершен.

Вернитесь в редактор, чтобы сохранить проект и развернуть его на Android-устройстве. Кнопки пользовательского интерфейса должны работать так же, как и раньше, теперь дополнительные уведомления срабатывают на устройстве после его загрузки. Закройте и откройте приложение, чтобы посмотреть, какие уведомления сбрасываются со временем.

Отображение уведомления об удержании на устройстве

Поздравляем! Вы освоили расширенные уведомления.

Чрезмерное использование уведомлений

Вооружившись новыми навыками оповещения, вы обладаете огромной властью, которая, как известно, сопряжена с большой ответственностью. Хотя уведомления хороши при правильном использовании, достаточно одного надоедливого уведомления, чтобы заставить пользователя отключить ВСЕ уведомления, поступающие из вашего приложения.

Даже важные уведомления, такие как напоминания о дне рождения вашей мамы, которые приходят слишком часто или посреди ночи, могут настолько расстроить пользователя, что он отключит ВСЕ будущие напоминания. Поэтому будьте осторожны при выборе и планировании уведомлений для отправки.

Куда пойти отсюда?

Отличная работа по завершению этого урока! Вы можете загрузить готовые файлы проекта, нажав ссылку в нижней части руководства.

Не стесняйтесь настраивать проект в соответствии с вашими потребностями и превращать его во что-то, что вас заметит. :]

Пакет мобильных уведомлений Unity будет продолжать развиваться, поэтому следите за последними обновлениями здесь: Пакет мобильных уведомлений Unity .

Если вас интересуют уведомления на iOS, посмотрите наш видеокурс по push-уведомлениям или прочитайте нашу книгу Push-уведомления от учебных пособий .

Надеюсь, вам понравился этот урок. Если у вас есть какие-либо вопросы или комментарии, пожалуйста, пишите в комментах внизу!

Скачать проект

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *