Приветствую! В данной статье пойдет речь про те самые пуш-уведомления на телефонах. Например, когда вам кто-то написал в мессенджере и шторке уведомлений вылазит окошко с текстом или если долго не заходишь в игру и она напоминает тебе о себе. Точнее мы разберем второй случай. Сделаем напоминалку о том, что желательно заходить в игру каждый день =)
Для чего это вообще нужно? Скажем так, чаще всего игры делаются для того, что бы заработать. Если игра бесплатная, то доход идет с рекламы или с донатных покупок. Поэтому желательно напоминать об игре, что-бы человек заходил каждый день. Ведь, если он уже зашел ,то обязательно что-то сделает, поиграет, посмотрит рекламу, или может вообще чего купит.
Итак, в unity существует специальный пакет для создания пушей. Работает он достаточно просто, однако есть свои нюансы. Его нужно добавить в Package Manager, он называется "Mobile notification". После чего создаем новый скрипт и как-то его обзываем, к примеру "PushNotificator" ( как оригинально ). Далее, создаем объект на сцене и кидаем наш скрипт на него.
Несмотря на то, что в юнити встроенный пакет для пуш-уведомлений, подход к их реализациям на разных платформах разный из-за их особенностей.
Уведомления на 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);
Вот так выглядит минимальное уведомления для андроида. Из параметров есть иконки, интент-данные, стили(об этом чуть позже, вещь важная) и еще несколько других.
Иконки
Иконки назначаются в 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;
}