Unity3d: плагин для Android push notifications

Android-push

В Unity3d есть классы для работы с пушами под iOS. Но нет стандартных средств сделать тоже самое и под Android. Приходится писать свой плагин на Java, который затем можно закинуть в Plugins/Android и делать native вызовы к нему. Если вас интересует, как создать свой плагин (в частности, плагин для отправки локальных пушей), заходим под кат.

  1. Как писать Android плагины для Unity3d
  2. AAR файл
  3. Проект плагина в Android Studio
  4. Настраиваем gradle build скрипт
  5. AndroidManifest.xml
  6. Ресурсы
  7. BroadcastReceiver
  8. Сборка AAR
  9. C# обёртка

Как писать Android плагины для Unity3d

У Unity есть доки о том, как написать свой плагин. Но он многим может показаться сложным, да и есть там неточности. Как минимум доки устарели в том плане, что ADT плагин скоро перестанет поддерживаться, что вынуждает нас использовать Android Studio. Я лично до этого всегда работал в Eclipse и меня всё устраивало. Единственное – перешёл с ant на maven в какой-то момент. Система сборки Gradle мне совсем не по душе, да и Android Studio не люблю (так как она базируется на IntelliJ IDEA, которую я недолюбливаю).

Начнём с того, что в Unity3d можно просто кинуть .jar’ник или aar’ку в Plugins/Android и затем использовать их в проекте. Так что, наша задача, по сути, собрать aar для Unity3d в Android Studio и написать врапер на C#, который будет дёргать нужные методы.

AAR

Да, собирать мы будем aar, а не jar, так как aar может содержать в себе ресурсы (layouts, drawables). Раньше Unity вполне нормально относился к тому, что пользователи кидали ресурсы в Plugins/Android/res. Нынче же такой метод помечен как deprecated, поэтому логичным решением будет использовать aar.

Как уже говорил, доки слегка устарели в этом плане. Там до сих пор указано, что можно использовать только .jar’ники:

There are several ways to create a Java plugin but the result in each case is that you end up with a .jar file containing the .class files for your plugin.

Подробнее про AAR формат можно почитать здесь.

Проект плагина в Android Studio

Просто создаём стандартный проект для Android. Для начала необходимо скопировать classes.jar из директории установки Unity. В доках сказано:

To do this, first locate the classes.jar shipped with Unity Android. It is found in the installation folder (usually C:\Program Files\Unity\Editor\Data (on Windows) or /Applications/Unity (on Mac)) in a sub-folder called PlaybackEngines/AndroidPlayer/Variations/mono or il2cpp/Development or Release/Classes/. Then add classes.jar to the classpath used to compile the new Activity.

У меня лично на Win7 этот файлик в C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes. В проекте создайте папочку libs и киньте туда classes.jar.

Настраиваем gradle build скрипт

После создания пустого проекта у вас будет создан build.gradle скрипт с примерно таким содержанием:

Нам из него надо выпилить всё ненужное. И, самое главное, необходимо поменять тип проекта с com.android.application на com.android.library. В итоге наш скрипт будет иметь такой вид:

AndroidManifest.xml

Так же удаляем всё ненужное. В итоге останется что-то такое:

Ресурсы

Для начала, удалите все ненужные файлы/папки вроде androidTest, Activity, слои и т.п. Из ресурсов нам необходимо создать только layout для отображения пуша:

И ещё необходимо картинки раскидать по нужным drawable директориям. Если верить сайту, то размеры для иконок пушей такие (размеры в пикселях):

22 × 22 area in 24 × 24 (mdpi)
33 × 33 area in 36 × 36 (hdpi)
44 × 44 area in 48 × 48 (xhdpi)
66 × 66 area in 72 × 72 (xxhdpi)
88 × 88 area in 96 × 96 (xxxhdpi)

Эта картинка показывается в status bar при получении пуша. Картина должна быть плоской (никаких градиентов и т.п.) и белой на прозрачном фоне.

BroadcastReceiver

Теперь остаётся только создать BroadcastReceiver:

Собственно, ничего примечательно, обычный BroadcastReceiver, с помощью которого можно отправлять обычные пуши (SetNotification) и повторяющиеся (SetRepeatingNotification). Ну и монжо отменить какой-то пуш по id (CancelNotification(int id))или же отменить их все (CancelAll).

Сборка AAR

assembleRelease

Собственно, остаётся только сбилдить проект. Пункт AssembleRelease справа. Теперь скопируем полученный aar в /Plugins/Android.

C# обёртка

Для начала добавить пермишены нужные в /Plugins/Android/AndroidManifest.xml:

И добавить наш UnityNotificationManager в application:

Остаётся только написать немного кода на C#. Создадим простенький скриптик LocalNotification.cs:

Собственно, всё. Как основу я испольщовал этот проект. Немного его допилил (перенёс проект с Eclipse на Android Studio). Пока что в тестовой ветке мой пул, но, думаю, в скором времени автор запушит в мастер ветку всё.

  Категории: Android, java, Unity3d, Коддинг
  • Nolex

    Прикольно, но кстати, в этой реализации от Agasper есть косяк. Нужно постоянно использовать новые ID. Если удалить ID и на этот же создать новый, то краш будет. Не очень удобно.

  • Магнус punkpg

    А после закрытия приложения работать не будет?

    • http://suvitruf.ru/ Suvitruf

      Будет.

      • Магнус punkpg

        сразу извиняюсь за тупость, попробовал пример с гитхаба с кнопками разных вариаций, при закрытии (не сворачивании) приложения, оповещений никаких нет :( при работающем приложении оповещения есть. Так же пробовал сделать по этому гайду, в Android Studio полный ноль, повторял все действия, но после замены gradle build скрипта, выдает ошибки на отсутствие colorAccent и еще двух color’ов и на DarkActionBar, и в скрипте Receiver в строке “builder.setSmallIcon(R.drawable.notify_icon_small);” не находит объект “R”

        • http://suvitruf.ru/ Suvitruf

          1) R.drawable.notify_icon_small – эту картинку вы сами должны положить в папку. Она будет отображаться в пуше.
          2) У нас в текущей игре этот плагин используется и вроде всё нормально с пушами. Возможно вы на стороне Unity что-то не дописали. К примеру, в манифесте.