はじめに
プッシュ通知には
・サーバーを介さないローカルプッシュ
・サーバーを介するリモートプッシュ
があります。
今回はローカルプッシュを実装していきます。
<2022年8月7日 追記>
ローカルプッシュ通知&リモートプッシュ通知のUdemy講座を数ヶ月かけて作りました!
この記事の内容でもローカルプッシュ通知は実装できますが、
足りない部分について深堀りした内容となっています。
ご興味ありましたらどうぞ!
<2022年8月7日 追記>
講座に追記:Android 13.0 以降のプッシュ通知ユーザー許可必須に伴う対応スクリプトの追加
【Unityアプリ収益化入門】収益アップに効果絶大!プッシュ通知機能をコピペで実装するユニティスマホアプリ開発コース
割引クーポン情報はこちらです。(配布不定期)
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の設定は次の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の設定は次の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
{
public static void RegisterChannel(string cannelId, string title, string description)
{
#if UNITY_ANDROID
var channel = new AndroidNotificationChannel()
{
Id = cannelId,
Name = title,
Importance = Importance.High,
Description = description,
};
AndroidNotificationCenter.RegisterNotificationChannel(channel);
#endif
}
public static void AllClear()
{
#if UNITY_ANDROID
AndroidNotificationCenter.CancelAllScheduledNotifications();
AndroidNotificationCenter.CancelAllNotifications();
#endif
#if UNITY_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
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
static private void SetAndroidNotification(string title, string message, int badgeCount, int elapsedTime, string cannelId)
{
var notification = new AndroidNotification
{
Title = title,
Text = message,
Number = badgeCount,
SmallIcon = "ic_stat_notify_small",
LargeIcon = "ic_stat_notify_large",
FireTime = DateTime.Now.AddSeconds(elapsedTime)
};
AndroidNotificationCenter.SendNotification(notification, cannelId);
}
#endif
}
コピペで大丈夫です。
Androidのアイコンの指定は下記の部分で行なっています。
・「Androidのアイコン設定で登録したIdentifierの文字列」
・下記の「SmallIcon」または「LargeIcon」に代入する文字列
が異なっているとデフォルトのアイコンが表示されてしまいますので注意して下さい。
SmallIcon = "ic_stat_notify_small",
LargeIcon = "ic_stat_notify_large",
2.ローカルプッシュ通知の条件を与えて呼び出すスクリプト作成
「LocalPushTest」という名前でスクリプトを作成しました。(名前はなんでも良いです。)
このコードでは3つのプッシュ通知を登録しています。
using UnityEngine;
public class LocalPushTest : MonoBehaviour
{
private void OnApplicationFocus()
{
SettingPush();
}
private void SettingPush()
{
LocalPushNotification.RegisterChannel("channelId", "PushTest", "通知の説明");
LocalPushNotification.AllClear();
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秒後に通知が来ます。
Android
iOS
おわりに
指定日時に送るときにはこちらが参考になりそうです。
qiita.com
Unity本を出版しました!
突然ですが、Unity本を出版しました!
こちらを読むことで、スクリプトの基礎固めができます!
現在、kindle unlimitedで読み放題設定中です。今のうちにどうぞ!
もっと早く教えてほしかった!Unity C#入門
他の記事
marumaro7.hatenablog.com
参考
shikaku-sh.hatenablog.com
qiita.com
docs.unity3d.com
grtlab.com
greenkour.hateblo.jp