はじめに
プッシュ通知には
・サーバーを介さないローカルプッシュ
・サーバーを介するリモートプッシュ
があります。
今回はローカルプッシュを実装していきます。
<2022年8月7日 追記>
ローカルプッシュ通知&リモートプッシュ通知のUdemy講座を数ヶ月かけて作りました!
この記事の内容でもローカルプッシュ通知は実装できますが、
足りない部分について深堀りした内容となっています。
ご興味ありましたらどうぞ!
割引クーポン情報はこちらです。(配布不定期) marumaro7.hatenablog.com
環境
Unityバージョン2020.3.2f1
Mobile Notifications 1.3.2
パッケージをインストール
Unityが用意してくれているパッケージ「Mobile Notifications」を使用します。
取り込み方法
→ウインドウ
→パッケージマネージャー
→パッケージの種類をUnityレジストリに変更(Unityのバージョンによっては名前が違うかもしれません。)
→mobileで検索
→Mobile Notifications
→インストール
設定
設定画面を開いてAndroidとiOSの個別のプッシュ通知設定をしていきます。
設定画面は
→編集
→プロジェクト設定
→Mobile Notifications
で見れます。
Android設定
Androidの設定は次の3つです。
・ReSchedule on Device Restart
有効:デバイスの再起動後にスケジュールされた通知を保持する。
無効:スケジュールされた通知はデバイスの再起動後に削除される。
今回は無効で運用します。
・Use Custom Activity
有効にすると
ユーザーが通知をタップしたときに開くアクティビティを上書きできます。
とのことなのですがよくわかりませんね。
任意の画面を開くということですかね?
特に使用しないので無効にして運用します。
・Notifications Icons
通知されたときの画像を登録します。
登録する画像は2種類あり用途とサイズは以下です。
追記 ※このサイズで作成する必要はありません。表示されるサイズになります。
Smallアイコン
用途:ステータスバーに表示されるアイコン
( 透明部分をくりぬいた白い画像が表示されます。)
サイズ:48×48
Largeアイコン
用途:プッシュ通知欄に表示されるアイコン
サイズ:192x192
<アイコン設定方法>
使用する画像は、プロジェクト内に保存されている必要があります。
Spritesフォルダなどを作って保存しておいて下さい。
そして、取り込んだ画像のインスペクター上で
「読み込み/書き込み有効」にチェックを入れて適用して下さい。
※これをしないとアイコン画像設定時に怒られます。
今回はこのように設定しました。
アイコンのIdentifierについては、
コード上でわかりやすくするため次のように設定しています。
Smallアイコン:ic_stat_notify_small
Largeアイコン:ic_stat_notify_large
iOS設定
iOSの設定は次の3つです。
・Request Authorization on App Launch
有効:アプリの起動時に承認リクエストウインドウを表示する
無効:アプリの起動時に承認リクエストウインドウを表示しない
Androidではプッシュ通知の許可は不要ですが、
iOSはユーザーの許可がないとプッシュ通知を送ることができません。
そのため、承認リクエストウインドウを出して
プッシュ通知を許可するかどうかを選択してもらう必要があります。
アプリ起動時に承認リクエストウインドウを表示して問題無いので
今回は有効にして進めます。
例:承認リクエストウインドウ
・Enable Push Notifications
有効:Xcode上でプッシュ通知機能の宣言を追加する
無効:Xcode上でプッシュ通知機能の宣言を追加しない
リモートプッシュをする際には、
Xcodeでプッシュ通知を使用することを宣言する必要があります。
ローカルプッシュでは無効にしておきます。
Xcode上の宣言設定
・Include Core Location Framework
特定の場所の範囲に入ったら通知するような時に使用します。
今回は使用しないのでオフにしておきます。
公式ドキュメント(翻訳)
iOSNotificationLocationTriggerを使用するには、[ CoreLocationフレームワークを含める]オプションを有効にする必要があります。このオプションは、フレームワークをXcodeプロジェクトに追加します。CoreLocation
コード実装
次の2種類のスクリプトを作成して実装していきます。
1.「ローカルプッシュ通知送信クラスのスクリプト」
2.「ローカルプッシュ通知の条件を与えて呼び出すスクリプト」
1.ローカルプッシュ通知送信クラスのスクリプト作成
「LocalPushNotification」という名前でスクリプトを作成します。
#if UNITY_ANDROID using Unity.Notifications.Android; #endif #if UNITY_IOS using Unity.Notifications.iOS; #endif using System; // ローカルプッシュ通知送信クラス public static class LocalPushNotification { // Androidで使用するプッシュ通知用のチャンネルを登録する。 public static void RegisterChannel(string cannelId, string title, string description) { #if UNITY_ANDROID // チャンネルの登録 var channel = new AndroidNotificationChannel() { Id = cannelId, Name = title, Importance = Importance.High,//ドキュメント 重要度を設定するを参照 https://developer.android.com/training/notify-user/channels?hl=ja 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 cannelId) { #if UNITY_ANDROID SetAndroidNotification(title, message, badgeCount, elapsedTime, cannelId); #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を使用します。(未検証) 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 = "ic_stat_notify_small",//どの画像を使用するかアイコンのIdentifierを指定 指定したIdentifierが見つからない場合アプリアイコンになる。 LargeIcon = "ic_stat_notify_large",//どの画像を使用するかアイコンのIdentifierを指定 指定したIdentifierが見つからない場合アプリアイコンになる。 FireTime = DateTime.Now.AddSeconds(elapsedTime) }; // 通知を送信します。 AndroidNotificationCenter.SendNotification(notification, cannelId); } #endif }
コピペで大丈夫です。
Androidのアイコンの指定は下記の部分で行なっています。
・「Androidのアイコン設定で登録したIdentifierの文字列」
・下記の「SmallIcon」または「LargeIcon」に代入する文字列
が異なっているとデフォルトのアイコンが表示されてしまいますので注意して下さい。
//Androidのアイコンを設定 SmallIcon = "ic_stat_notify_small",//どの画像を使用するかアイコンのIdentifierを指定 指定したIdentifierが見つからない場合アプリアイコンになる。 LargeIcon = "ic_stat_notify_large",//どの画像を使用するかアイコンのIdentifierを指定 指定したIdentifierが見つからない場合アプリアイコンになる。
2.ローカルプッシュ通知の条件を与えて呼び出すスクリプト作成
「LocalPushTest」という名前でスクリプトを作成しました。(名前はなんでも良いです。) このコードでは3つのプッシュ通知を登録しています。
using UnityEngine; public class LocalPushTest : MonoBehaviour { //Unityが用意した関数(名前は固定) //「アプリを開始した時」、「Homeボタンを押した時」、「Backボタンを押した時(ボタンはAndroidのみに存在)」、「OvewViewボタンを押した時(ボタンはAndroidのみに存在)」に実行 private void OnApplicationFocus() { SettingPush();//プッシュ通知の設定 } //プッシュ通知の設定 private void SettingPush() { // Androidチャンネルの登録 //LocalPushNotification.RegisterChannel(引数1,引数2,引数3); //引数1 Androidで使用するチャンネルID なんでもいい LocalPushNotification.AddSchedule()で使用する //引数2 チャンネルの名前 なんでもいい アプリ名でも入れておく //引数3 通知の説明 なんでもいい 自分がわかる用に書いておくもの LocalPushNotification.RegisterChannel("channelId", "PushTest", "通知の説明"); //通知のクリア LocalPushNotification.AllClear(); // プッシュ通知の登録 //LocalPushNotification.AddSchedule(引数1,引数2,引数3,引数4,引数5); //引数1 プッシュ通知のタイトル //引数2 通知メッセージ //引数3 表示するバッジの数(バッジ数はiOSのみ適用の様子 Androidで数値を入れても問題無い) //引数4 何秒後に表示させるか? //引数5 Androidで使用するチャンネルID 「Androidチャンネルの登録」で登録したチャンネルIDと合わせておく //注意 iOSは45秒経過後からしかプッシュ通知が表示されない LocalPushNotification.AddSchedule("プッシュ通知一つ目", "45秒経過", 1, 45, "channelId"); LocalPushNotification.AddSchedule("プッシュ通知二つ目", "60秒経過", 2, 60, "channelId"); LocalPushNotification.AddSchedule("プッシュ通知三つ目", "75秒経過", 3, 75, "channelId"); } }
詳しくはコード内に書きましたので、概要だけ書きます。
プッシュ通知の設定関数「SettingPush()」で行っている処理は3つです。
1.Androidのチャンネルの登録 (儀式みたいなものと思っています。)
2.通知のクリア
(予約されているプッシュ通知やアイコン上に表示されているバッジマークを消します。)
3.プッシュ通知の登録
そして、SettingPush()で設定された処理を
OnApplicationFocus()で呼び出しています。
OnApplicationFocus()の関数はUnityが用意した関数で下記の場合に実行されます。
・アプリを開始した時
・Homeボタンを押した時
・Backボタンを押した時(ボタンはAndroidのみに存在)
・OvewViewボタンを押した時(ボタンはAndroidのみに存在)
詳しくはこちら
qiita.com
SettingPush()の関数をスタート関数で実行するだけでもプッシュ通知は呼ばれますが、
アプリバックグラウンド起動中にプッシュ通知がきてアプリを開いても
プッシュ通知がリセットされません。
また、バッジ設定をしていた場合ずっとバッジのアイコンが残ったままになってしまいます。
3.オブジェクトに割り当ててビルド
空のオブジェクトを作成し「LocalPushTest」のスクリプトを割り当ててビルドして下さい。
結果
AndroidとiOSにて、 アプリを開いて45秒後、60秒後、75秒後に通知が来ます。
おわりに
指定日時に送るときにはこちらが参考になりそうです。