こんにちは、エンジニアのオオバです。

Unity公式のモバイル端末向けローカルPush通知パッケージMobile Notificationsというものを試しました。

検証してみたところ、Android7.1端末、8.0端末、iOS12のiPhone6sで動作確認は取っています。現在Preview版とのことですが、とりあえず動いてはいます。

使い方は簡単で、Pluginsフォルダを汚すことなく各プラットフォームごとの処理をC#コードを書いていくだけです。

👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!

Android版の対応

比較的、実機確認までが容易なAndroidから説明していきます。
Mobile NotificationsをインストールするとProject SettingsにMobile Notification Settingsという項目が追加されます。各プラットフォームのタブがあるので、Androidを選びます。

【無料】Unity公式Mobile NotificationsでローカルPush通知を実装する_0

Androidは通知アイコン設定のみで、非常にシンプルです。

項目内容備考
IdentifierアイコンID重複してもエラーにならないので注意
Type種類(small or large)smallの場合はアルファ抜き白になる

【無料】Unity公式Mobile NotificationsでローカルPush通知を実装する_1

ヘッダに表示されるアイコンが、TypeがSmalle Iconです。

【無料】Unity公式Mobile NotificationsでローカルPush通知を実装する_2

【無料】Unity公式Mobile NotificationsでローカルPush通知を実装する_3

このように通知されます。この通知UIをタップするとアプリが立ち上がります。

  1. 通知チャンネルを登録
  2. 通知を予約する

通知によってアイコン、文章を変更することができます。
アイコンは予めアプリに埋め込んでおく必要がありそうですが、文言はマスターに登録しておくなどすれば自由に変更することが可能です。

抜粋コードですが、以下のような実装になります。

通知チャンネルを登録

AndroidNotificationCenter.RegisterNotificationChannel(new AndroidNotificationChannel  
{
    Id = ChannelId,  
    Name = "Default ChannelName",  
    Importance = Importance.High,  
    Description = "Channel Description",  
});  

通知を予約する

AndroidNotificationCenter.SendNotification(new AndroidNotification  
{
    Title = title,  
    Text = body,  
    SmallIcon = "icon_0",  
    LargeIcon = "icon_1",  
    FireTime = System.DateTime.Now.AddSeconds(afterSec),  
    Number = 1  
}, ChannelId);  

どちらもAndroidNotificationCenterクラスを通して処理を書きます。
ちなみに、通知音を変更することは現状できません。アップデートに期待です。

通知アイコンが出ない問題

Number = 1と設定しているが通知アイコン(アプリアイコン付く番号アイコン)が表示されない問題に出くわしております。どなたか解決方法知りませんかね...?

iOS版の対応

※本記事ではCoreLocation frameworkについては言及しません。あくまで時間をトリガーに通知させます。

【無料】Unity公式Mobile NotificationsでローカルPush通知を実装する_4

iOSはAndroidと違ってまあまあ設定項目がありますが、今回はアプリ起動時に通知許可を確認するのでRequest Authorization on App Launchにチェックを入れます。ローカル Push通知だけであれば、これ以上特に設定する項目はありません。

【無料】Unity公式Mobile NotificationsでローカルPush通知を実装する_5

※このようにアプリ初回起動直後に通知の許可確認ポップアップが表示されます。

Android版との違い

iOSNotificationCenter.ScheduleNotification(new iOSNotification()  
{
    Title = title,  
    Body = body,  
    ShowInForeground = true,  
    Badge = 1,  
    Trigger = new iOSNotificationTimeIntervalTrigger()  
    {
        TimeInterval = new System.TimeSpan(0, 0, afterSec),  
        Repeats = false  
    }
});  

通知ポップアップが許可されれば、上記のようなコードを実行するだけで通知は予約されます。

スリープ時通知アクティブ時通知通知アイコン

【無料】Unity公式Mobile NotificationsでローカルPush通知を実装する_6

このような感じにC#を書くだけで通知してくれます。

通知アイコン消せない問題

【無料】Unity公式Mobile NotificationsでローカルPush通知を実装する_7

Androidに引き続きiOSでも1点問題が発生しまして、通知をタップしたら通知アイコンも消えるのかなって思っていたらですね、消えません...。
この件に関しては、また別途検証しようと思います。

※解決しました↓↓
Unity製MobileNotificationsのローカルPush通知アイコンをアプリ起動時に消す

まとめ

ネイティブプラグインを扱うことなく、C#のみでローカルプッシュ通知を実装できました。
また Unityが公式でサポートしているという点が心強いです。
早くPreviewが取れてもらいたいものです。Unity2019のどこかですかね。。。?

今回のサンプルのフルソースは以下です。
通知をキャンセルしたり、他にもいろいろやりたい場合は、このままではできませんが、ただ、動くことを確認するくらいなら問題ないかと思います。

MobileNotificationsサンプルコード · GitHub

// 10秒後に通知  
LocalNotificationWrapper. ReserveNotification("タイトル", "本文", 10);  

こんな感じで使います。

オススメ記事
検証環境
参考サイト