プッシュ通知用のパッケージをインストールする
まずは、プッシュ通知を実装するためのパッケージをインストールします。
画面上のメニューバーから、「Window → Package Manager」 をクリックします。
PackageManagerのウィンドウが開いたら、ウィンドウ上部の「Packages」を「Unity Registry」変更します。
パッケージの一覧が表示されるので、「Mobile Notifications」を選択して、「Install」ボタンをクリックします。
インストールが始まるので、しばらく待ちます!
「Install」の文字が「Remove」に変わっていれば、インストール完了です!
パッケージの設定
パッケージのインストールが完了したら、プッシュ通知の設定を行っていきます。
画面上のメニューバーから、「Edit → ProjectSettings」 をクリックします。
ProjectSettingsのウィンドウが開くので、左側の一覧から「Mobile Notifications」を選択します。
AndroidとiOSで設定が違うので、それぞれ設定を紹介していきます!
Androidの設定
Reschedule on Device Restart
この設定は、スマホを再起動した後にプッシュ通知のスケジュールを保持しておくかを設定することが出来ます。
例えば、アプリを起動してから1日後にプッシュ通知を行いたいという時に、1日に1回はスマホを再起動するという人がいた場合では、チェックを外しているとプッシュ通知の時間のカウントがリセットされてしますことになります。
個人的には、とりあえずチェックを入れておけばいいと思います!
Use Custom Activity
ユーザーが通知をタップしたときに開くアクティビティをオーバーライドできます。
https://docs.unity3d.com/Packages/com.unity.mobile.notifications@1.3/manual/Settings.html
公式では、このような説明がされていますが、恐らく通知をタップしたときのアクションを指定する設定だと思います。
チェックが外れていれば、通知をタップしたときにアプリが起動するので、特殊なことをしないのであれば、チェックを外しておいて問題ないと思います!
Notification Icons
この設定は、通知されたときの画像を登録することが出来ます!
iOSではアプリのアイコンが表示されますが、Androidは設定が必要なようです。
登録できる画像のサイズは2種類あって、SmallとLargeがあります。
Small : ステータスバーに表示されるアイコン Size = 48x48
Large : プッシュ通知の一覧に表示されるアイコン Size = 192x192
※ここでのSizeは、表示されるサイズなので、画像をそれぞれのサイズで用意する必要はありません!
アイコンに使用したい画像のRead/Writeにチェックも入れておいてください!
チェックを入れていないと、赤文字で警告が表示されてしまいます。
とりあえず、SmallとLargeを設定しました。それぞれにIdentifierという項目がありますが、これはこの後紹介するプログラム内で設定を識別するIDとなります。
今回は例として、
Small = "small_icon"
Large = "large_icon"
となっています!
iOSの設定
Request Authorization on App Launch
この設定は、アプリ起動時にプッシュ通知の承認リクエストウィンドウを表示するかを、設定することが出来ます!
iOSでは、アプリのプッシュ通知の許可がされていないと、通知を送ることが出来ません。
通知の許可を促すためにも、チェックを入れておきましょう!
Enable Push Notifications
この設定は、Xcode上で別途プッシュ通知を実装するときにチェックを入れておく必要がある設定です。
今回は、Unity上だけで完結できるローカルのプッシュ通知なので、チェックを外しておきましょう!
Include Core Location Framework
この設定は、現実世界で特定の範囲に入ったら通知をするときに使用します。※別途FrameWorkの追加が必要です。
今回は使わないので、チェックを外しておきます!
コードを実装する
プッシュ通知操作クラス
#if UNITY_ANDROID
using Unity.Notifications.Android;
#endif
#if UNITY_IOS
using Unity.Notifications.iOS;
#endif
using System;
public static class LocalPushNotificationController
{
// Androidのプッシュ通知用のチャンネルを登録
public static void RegisterChannel(string channelId, string title, string description)
{
#if UNITY_ANDROID
// チャンネルの登録
var channel = new AndroidNotificationChannel()
{
Id = channelId, //idを設定
Name = title, //タイトルを設定
Importance = Importance.High, //重要度を設定
Description = description, //通知の説明を設定
};
//チャンネル設定を登録
AndroidNotificationCenter.RegisterNotificationChannel(channel);
#endif
}
/// 通知をすべてクリア
public static void AllClear()
{
#if UNITY_ANDROID
// Androidの通知をすべて削除
AndroidNotificationCenter.CancelAllScheduledNotifications();
AndroidNotificationCenter.CancelAllNotifications();
#endif
#if UNITY_IOS
// iOSの通知をすべて削除
iOSNotificationCenter.RemoveAllScheduledNotifications();
iOSNotificationCenter.RemoveAllDeliveredNotifications();
// バッジを消去
iOSNotificationCenter.ApplicationBadge = 0;
#endif
}
// プッシュ通知を登録
public static void AddSchedule(string title, string message, int badgeCount, int elapsedTime, string channelId)
{
#if UNITY_ANDROID
SetAndroidNotification(title, message, badgeCount, elapsedTime, channelId);
#endif
#if UNITY_IOS
SetIOSNotification(title, message, badgeCount, elapsedTime);
#endif
}
#if UNITY_IOS
// 通知を登録(iOS)
static private void SetIOSNotification(string title, string message, int badgeCount, int elapsedTime)
{
// 通知を作成
iOSNotificationCenter.ScheduleNotification(new iOSNotification()
{
Identifier = $"_notification_{badgeCount}",
Title = title,
Body = message,
ShowInForeground = false,
Badge = badgeCount,
Trigger = new iOSNotificationTimeIntervalTrigger()
{
TimeInterval = new TimeSpan(0, 0, elapsedTime),
Repeats = false
}
});
}
#endif
#if UNITY_ANDROID
// 通知を登録(Android)
static private void SetAndroidNotification(string title, string message, int badgeCount, int elapsedTime, string cannelId)
{
// 通知を作成
var notification = new AndroidNotification
{
Title = title, //タイトルを設定
Text = message, //メッセージの内容を設定
Number = badgeCount, //バッジの数を設定(アプリアイコンに表示される)
//Androidのアイコンを設定
SmallIcon = "small_icon",
LargeIcon = "large_icon",
FireTime = DateTime.Now.AddSeconds(elapsedTime) //通知を表示する時間を設定
};
// 通知を送信
AndroidNotificationCenter.SendNotification(notification, cannelId);
}
#endif
}
このクラスでは、プッシュ通知の登録を操作するクラスです。
すべて紹介すると長くなるので、中身を詳しく見たい方は、コード内のコメントを見てみてください!
プッシュ通知を管理するクラス
using System.Collections.Generic;
using UnityEngine;
using System;
[Serializable]
public struct PushNotificationSettings
{
[Header("タイトル")]
public string title;
[Header("メッセージ")]
public string message;
[Header("表示するバッジのカウント")]
public int badgeCount;
[Header("何秒後に表示するか")]
public int elapsedTime;
}
public class LocalPushNotificationManager :MonoBehaviour
{
[SerializeField, Header("チャンネルID(なんでもOK)")] private string _channelId = "";
[SerializeField, Header("チャンネル名(なんでもOK)")] private string _channelName = "";
[SerializeField, Header("通知の説明文(メモ用なのでユーザーは観ることが出来ない)")] private string _description = "説明文";
[SerializeField, Header("通知設定リスト")] private List<PushNotificationSettings> _pushNotificationSettingsList;
private void Start()
{
SettingPushNotification();
}
//プッシュ通知を設定する
public void SettingPushNotification()
{
//チャンネルの登録
LocalPushNotificationController.RegisterChannel(_channelId,_channelName,_description);
//プッシュ通知の設定をすべて登録する
foreach(var setting in _pushNotificationSettingsList)
{
LocalPushNotificationController.AddSchedule(setting.title, setting.message, setting.badgeCount, setting.elapsedTime, _channelId);
}
}
}
このクラスでは、プッシュ通知の登録を命令するクラスです。
プッシュ通知の内容を、構造体のリストで登録することが出来ます!
今回は、お試しでStart関数でプッシュ通知の登録を行っていますが、実際に使用するときはプッシュ通知のスケジューリングを行いたいタイミングで、呼んであげてください!
Inspectorでの設定例
画像のように、空のゲームオブジェクトを用意して、LocalPushNotificationManagerコンポーネントを追加してください!
追加したら、各項目を設定すればUnityでの作業は以上です。
後は、端末でアプリを起動してみてプッシュ通知が表示されれば完了です!
お疲れさまでした!