Unity: push-уведомления (Android / iOS)

Приветствую! В данной статье пойдет речь про те самые пуш-уведомления на телефонах. Например, когда вам кто-то написал в мессенджере и шторке уведомлений вылазит окошко с текстом или если долго не заходишь в игру и она напоминает тебе о себе. Точнее мы разберем второй случай. Сделаем напоминалку о том, что желательно заходить в игру каждый день =)

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

Итак, в unity существует специальный пакет для создания пушей. Работает он достаточно просто, однако есть свои нюансы. Его нужно добавить в Package Manager, он называется "Mobile notification". После чего создаем новый скрипт и как-то его обзываем, к примеру "PushNotificator" ( как оригинально ). Далее, создаем объект на сцене и кидаем наш скрипт на него.

Unity: push-уведомления (Android / iOS)

Несмотря на то, что в юнити встроенный пакет для пуш-уведомлений, подход к их реализациям на разных платформах разный из-за их особенностей.

Уведомления на Android

Первым делом конечно-же подключаем пакет.

using Unity.Notifications.Android; 

В андроиде существует такое понятие как канал. Канал дает пользователю возможность настроить разные уведомления по своему усмотрению. Делается это в настройках приложения. Там можно настроить звуки, вибрацию, индикацию светом, отображение иконки в шторке, всплывающие окна и тд. А так же конечно отключить совсем. В общем-то тема интересная и полезная.

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

AndroidNotificationChannel channel = new AndroidNotificationChannel()
        {
            Id = ChannelID,
            Name = "Standart",
            Importance = Importance.Default,
            Description = "Gift notification"
        };
AndroidNotificationCenter.RegisterNotificationChannel(channel);

Далее необходимо оформить само уведомление, однако мы же хотим создать напоминалку о том, что человек не заходил уже к примеру целых 24 часа в игру и пора бы размять пальцы. Поэтому чтобы уведомление не появлялось если человек зашел, нужно их очищать из системного списка задач. Для этого существует команда:

AndroidNotificationCenter.CancelAllNotifications();

Она удаляет все запланированные пуши. Теперь-же создадим новое запланированное уведомление или несколько уведомлений.

var notification = new AndroidNotification();
notification.Title = "Заголовок";
notification.Text = "Основной текст пуша";
notification.FireTime = System.DateTime.Now.Date.AddHours(24);

Вот так выглядит минимальное уведомления для андроида. Из параметров есть иконки, интент-данные, стили(об этом чуть позже, вещь важная) и еще несколько других.

Иконки

Unity: push-уведомления (Android / iOS)

Иконки назначаются в Project settings вашего проекта. После того как вы добавили пакет в менеджере в настройках проекта появится соответствующий пункт. Туда закидываете нужные иконки, размеры там написаны, но я продублирую: 48х48 и 192х192. Рядом появляется имя, можно менять, можно не менять, запоминаем и добавляем к нашему уведомлению в скрипте если необходимо, командой:

notification.SmallIcon = "icon_0";//для маленькой иконки в строке
notification.LargeIcon = "icon_1";//для большой иконки в самом уведомлении

Иконки не обязательны, но с ними все же красивее.

Intent-данные

При создании уведомления, можно прописать в него некие данные, для последующего определения, по нему ли кликнул пользователь или зашел сам. Штука тоже не обязательная, но в некоторых случаях полезная. Хотя, я не рекомендую завязывать какие-то действия на клики. Лучше определять нужные события обособленно, тем же таймером. Иначе пользователь может увидеть сообщение о подарке в игре, открыть ее через иконку и не получить ни чего. Он разочаруется, а может и обидеться.

Реализуется интент также не сложно:

notification.IntentData = "строка для определения";

Что-бы определить нажатие, при запуске игры необходимо запросить последний интент с помощью команды:

AndroidNotificationCenter.GetLastNotificationIntent();

Функция вернет обычную переменную string. Далее нужно сравнить ее со своими значениями и делать что-то с этим дальше, останавливаться на этом я не буду.

Стили

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

notification.Style = NotificationStyle.BigTextStyle;

Отправка в список задач

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

Делается одной командой:

AndroidNotificationCenter.SendNotification(notification, channel.Id);

Собственно все, уведомление придет в назначенное время. В нашем случае через 24 часа.

Уведомления на iOS

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

Добавляем в скрипт зависимость using Unity.Notifications.iOS;

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

IEnumerator RequestAuthorization()
{
    var authorizationOption = AuthorizationOption.Alert | AuthorizationOption.Badge;
    using (var req = new AuthorizationRequest(authorizationOption, true))
    {
        while (!req.IsFinished)
        {
            yield return null;
        };
    }
}

Создаем корутину, и ждем пока пользователь соизволит разрешить нам работать дальше. Как видим из кода, при ответе у нас появляется переменная req. Проверяя ее, мы можем определить ответ пользователя и если он дал нам разрешение, будем создавать пуш.

у меня вышел вот такой код который выполниться если req.Granted == true:

if (req.Granted){
iOSNotificationCenter.RemoveAllScheduledNotifications();
var timeTrigger = new iOSNotificationTimeIntervalTrigger()
{
    // TimeSpan(long ticks);
    // TimeSpan(int hours, int minutes, int seconds);
    // TimeSpan(int days, int hours, int minutes, int seconds);
    // TimeSpan(int days, int hours, int minutes, int seconds, int milliseconds);

    TimeInterval = new System.TimeSpan(24,0,0),
    Repeats = false
};



var notification = new iOSNotification()
{
    Identifier = "_notification_01",
    Title = "Заголовок",
    Body = "Основное текст",
    Subtitle = "Второй подбородок",
    ShowInForeground = true,
    ForegroundPresentationOption = (PresentationOption.Alert | PresentationOption.Sound),
    CategoryIdentifier = "category_a",
    ThreadIdentifier = "thread1",
    Trigger = timeTrigger,
};

iOSNotificationCenter.ScheduleNotification(notification);
}

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

Не забываем запустить корутину где-нибудь к примеру в методе Awake или Start.

Бонус. Эмодзи в уведомлении

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

Для этого я пропускаю строки пушей через простую функцию в которой заменяю теги на смайлы и после этого регистрирую уведомление в системе.

string emojiReplace(string text){
    text = text.Replace(":gift:", "🎁");
    return text;
}

Пока нет оценок, но вы можете быть первым!

Оцените