モバイルアプリの開発において、ユーザーエンゲージメントを向上させるための強力なツールとしてローカル通知は欠かせません。今回の記事では、Unityでのローカル通知の実装方法を一緒に学んでいきましょう。公式パッケージ「Unity Mobile Notifications」を使って、あなたのアプリに手軽にローカル通知を追加するためのステップバイステップガイドをご提供します。Unityの初心者でも安心して取り組むことができますので、ぜひ最後までお付き合いください!
パッケージの導入と設定
今回はサーバーを必要としない、ローカルのみの通知処理を実装します。アプリ内で予測できる内容でのみ使えます。パッケージのドキュメントリンクはこちら。パッケージのバージョンなどが上がっている場合は左上のプルダウンから対象のバージョンに変えてください。
Mobile Notificationsパッケージ
Window>Package Managerからパッケージマネージャーを開きます。右上のプルダウンをUnity Registryに切り替えてください。リストから「Mobile Notifications」を探し、選択します。
選択出来たら右下の「Install」ボタンから導入を行ってください。
プロジェクト設定
Edit>Project Settingsからプロジェクトセッティングを行います。ここではAndroidとiOSので少し設定が変わります。必要に応じて行ってください。
Android
アンドロイドでは、表示されるアイコンを指定することが出来ます。ここではsmallというアイコンを追加しました。ここのアイコン画像は注意点があります。下記のようなエラーが表示される場合、設定したい画像を選択してください。
画像の設定はRead/WriteのチェックボックスをONにしてください。
iOS
iOS側ではアイコンの設定は出来ません。デフォルトだとそのままで問題ありませんが、アプリ起動時に通知を行っても良いかの確認画面の表示を行うように設定が出来ます。
呼び出すコード
パッケージの導入と設定が確認できたらあとはソースコードを用意して実際に動かせば通知が行われます。
Android版
下記スクリプトをシーン内のGameObjectに貼り付けると、10秒後にローカル通知が行われます。
using UnityEngine;
using Unity.Notifications.Android;
public class NotificationManager : MonoBehaviour
{
private void Start()
{
var channel = new AndroidNotificationChannel()
{
Id = "channel_id",
Name = "Default Channel",
Importance = Importance.High,
Description = "Default notifications",
};
AndroidNotificationCenter.RegisterNotificationChannel(channel);
var notification = new AndroidNotification()
{
Title = "タイトル部分",
Text = "テキスト部分",
FireTime = System.DateTime.Now.AddSeconds(10)
};
AndroidNotificationCenter.SendNotification(notification, "channel_id");
}
}
Android版では、事前にどういった通知を行うかのパターンを登録。利用する場合はタイミングを指定して、どのパターン(ID)を呼び出すか。ビューとコントロールが別れている感じですね。
iOS版
iOS版もAndroidと同様にシーン内に貼り付けた場合、スクリプトが動くと10秒あとにローカル通知が行われます。
using UnityEngine;
using Unity.Notifications.iOS;
public class NotificationManager : MonoBehaviour
{
private void Start()
{
var timeTrigger = new iOSNotificationTimeIntervalTrigger()
{
TimeInterval = new System.TimeSpan(0, 0, 0, 10),
Repeats = false
};
var notification = new iOSNotification()
{
Identifier = "_notification_01",
Title = "タイトル",
Body = "ボディ部分",
Subtitle = "サブタイトル",
ShowInForeground = true,
ForegroundPresentationOption = (PresentationOption.Alert | PresentationOption.Sound),
CategoryIdentifier = "category_a",
ThreadIdentifier = "thread1",
Trigger = timeTrigger,
};
iOSNotificationCenter.ScheduleNotification(notification);
}
}
iOS版は通知のたびに内容とタイミングを指定します。ある意味こちらの方がわかりやすいかも?
両プラットフォーム対応版
先に載せておけよと思ったけど、片方ずつ認識しておきたかったので別々に作りました。実際には各プラットフォームに対応したスクリプトを用意することが多いです。#シャープ始まりの部分は、現在選択中のプラットフォームのときのみアクティブになる部分で、共通のクラスを維持しつつ、中身をプラットフォームごとに変更したい場合に利用されます。
using UnityEngine;
#if UNITY_ANDROID
using Unity.Notifications.Android;
#elif UNITY_IOS
using Unity.Notifications.iOS;
#endif
public class NotificationManager : MonoBehaviour
{
void Start()
{
#if UNITY_ANDROID
var channel = new AndroidNotificationChannel()
{
Id = "channel_id",
Name = "Default Channel",
Importance = Importance.High,
Description = "Default notifications",
};
AndroidNotificationCenter.RegisterNotificationChannel(channel);
var notification = new AndroidNotification()
{
Title = "タイトル部分",
Text = "テキスト部分",
FireTime = System.DateTime.Now.AddSeconds(10)
};
AndroidNotificationCenter.SendNotification(notification, "channel_id");
#elif UNITY_IOS
var timeTrigger = new iOSNotificationTimeIntervalTrigger()
{
TimeInterval = new System.TimeSpan(0, 0, 0, 10),
Repeats = false
};
var notification = new iOSNotification()
{
Identifier = "_notification_01",
Title = "タイトル",
Body = "ボディ部分",
Subtitle = "サブタイトル",
ShowInForeground = true,
ForegroundPresentationOption = (PresentationOption.Alert | PresentationOption.Sound),
CategoryIdentifier = "category_a",
ThreadIdentifier = "thread1",
Trigger = timeTrigger,
};
iOSNotificationCenter.ScheduleNotification(notification);
#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
}
コメント