iOS の通知
承認リクエスト
ローカル通知を送信したりリモート通知を受信したりするには、システムにアクセス許可をリクエストする必要があります。これには、AuthorizationRequest を使用します。特定の種類の通知のみを送信するためのアクセス許可を要求することができます。以下の例は、UI Alert ダイアログを表示してアプリケーションアイコンにバッジを追加するためのアクセス許可をリクエストする方法を示しています。
IEnumerator RequestAuthorization()
{
var authorizationOption = AuthorizationOption.Alert | AuthorizationOption.Badge;
using (var req = new AuthorizationRequest(authorizationOption, true))
{
while (!req.IsFinished)
{
yield return null;
};
string res = "\n RequestAuthorization:";
res += "\n finished: " + req.IsFinished;
res += "\n granted : " + req.Granted;
res += "\n error: " + req.Error;
res += "\n deviceToken: " + req.DeviceToken;
Debug.Log(res);
}
}
現在の承認ステータスを確認するには、同じリクエストを再度送信します。ユーザーがすでに承認を許可または拒否している場合は、アクセス許可のリクエストダイアログが再び表示されることはありません。
また、ユーザーがアプリケーションを起動した際に、自動承認リクエストを有効にすることもできます。詳細については、通知設定 を参照してください。
ユーザーは、システム設定で通知の種類ごとに承認ステータスをいつでも変更できます。必要な場合は、iOSNotificationCenter.GetNotificationSettings を呼び出すことで、実際の承認ステータスを確認できます。
デバイストークン
デバイストークンは、Apple が特定のデバイス上の特定のアプリケーションに割り当てた固有の識別子を含むデータです。ユーザーが承認リクエストを確認した後にプッシュ通知を送信する場合は、まずデバイストークンを取得する必要があります。
デバイストークンを取得するには、以下を実行する必要があります。
通知設定 で Enable Push Notifications オプションを有効にします。
registerForRemoteNotifications
を true に設定して、承認リクエストを作成します。
デバイスにプッシュ通知を送信する方法およびアプリケーションにプッシュ通知のサポートを追加する方法の詳細については、リモート通知の処理 に関する Apple Developer ドキュメントを参照してください。
通知の管理
このパッケージには、通知を管理するための一連の API が用意されています。これらの API により、通知の送信、更新、削除といったアクションが可能になります。通知に関連する API の詳細については、iOSNotificationCenter を参照してください。
シンプルな通知の送信
以下の例は、時間間隔トリガー で通知をスケジュールする方法を示しています。
var timeTrigger = new iOSNotificationTimeIntervalTrigger()
{
TimeInterval = new TimeSpan(0, minutes, seconds),
Repeats = false
};
var notification = new iOSNotification()
{
// 後で通知を管理するために使用できるカスタム識別子を指定できます。
// 指定しない場合、一意の文字列が自動的に生成されます。
Identifier = "_notification_01",
Title = "Title",
Body = "Scheduled at: " + DateTime.Now.ToShortDateString() + " triggered in 5 seconds",
Subtitle = "This is a subtitle, something, something important...",
ShowInForeground = true,
ForegroundPresentationOption = (PresentationOption.Alert | PresentationOption.Sound),
CategoryIdentifier = "category_a",
ThreadIdentifier = "thread1",
Trigger = timeTrigger,
};
iOSNotificationCenter.ScheduleNotification(notification);
以下のコード例では、通知が発動されない場合に通知がキャンセルされます。
iOSNotificationCenter.RemoveScheduledNotification(notification.Identifier);
以下のコード例では、すでに配信済みの場合に Notification Center から通知が削除されます。
iOSNotificationCenter.RemoveDeliveredNotification(notification.Identifier);
その他のトリガー
時間間隔トリガーのほかに、このパッケージにはさらに 3 種類のトリガーが用意されています。
- カレンダートリガー
- 位置トリガー
- プッシュトリガー
カレンダートリガー
iOSNotificationCalendarTrigger のフィールドはすべて任意ですが、トリガーを動作させるためには少なくとも 1 つのフィールドを設定する必要があります。例えば、時間と分のフィールドのみを設定した場合、指定した時刻が次に巡ってきたときに、自動的に通知が発動されます。
var calendarTrigger = new iOSNotificationCalendarTrigger()
{
// Year = 2020,
// Month = 6,
//Day = 1,
Hour = 12,
Minute = 0,
// Second = 0
Repeats = false
};
位置トリガー
デバイスが特定の地理的領域に出入りしたときに通知を配信するようスケジュールする場合は、iOSNotificationLocationTrigger を作成できます。
このトリガーで通知をスケジュールする前に、通知設定 で Include CoreLocation Framework オプションを有効にする必要があります。アプリケーションには、Core Location を使用するための承認と、使用時のアクセス許可が必要です。この承認は、Unity LocationService API を使用してリクエストできます。 詳細については、Apple Developer ウェブサイトにある Core Location のドキュメントを参照してください。
以下の例では、中心座標は WGS 84 システムを使用して定義されています。ユーザーがパリのエッフェル塔を中心とした半径 250 m の領域内に入ると、アプリケーションは通知を発動します。
var locationTrigger = new iOSNotificationLocationTrigger()
{
Latitude = 48.858263,
Longitude = 2.294498,
Radius = 250f,
NotifyOnEntry = true,
NotifyOnExit = false,
}
プッシュトリガー
アプリケーションから実際にプッシュ通知を送信することはできないので、iOSNotificationPushTrigger インスタンスを作成する必要はありません。この通知トリガーは、通知が Apple Push Notification Service (APNs) から送られたかどうかを示すために使用されます。
通知受信コールバック
iOSNotificationCenter.OnNotificationReceived
デフォルトでは、アプリケーションがフォアグラウンドにあるときにローカル通知を発動した場合、デバイスにはその通知に対するアラートは表示されません。デバイスでアプリケーションが実行されていないかのように通知を動作させる場合は、以下に示すように、通知をスケジュールするときに ShowInForeground
プロパティを true に設定します。
notification.ShowInForeground = true;
// この場合、その 'ForegroundPresentationOption' を指定する必要があります
notification.ForegroundPresentationOption = (PresentationOption.Sound | PresentationOption.Alert);
iOSNotificationCenter.OnNotificationReceived
イベントをサブスクライブすることにより、アプリケーションが通知を発動したときに他のアクションを実行することもできます。例えば、アプリケーションの UI を使用して通知のコンテンツを表示できます。アプリケーションは、フォアグラウンドに表示されているかどうかに関係なく、ローカル通知またはリモート通知を受信するたびに、このイベントを呼び出します。
iOSNotificationCenter.OnRemoteNotificationReceived
アプリケーションの実行中に受信したリモート通知のコンテンツを変更または非表示にするには、iOSNotificationCenter.OnRemoteNotificationReceived
イベントをサブスクライブします。このイベントをサブスクライブすると、アプリケーションの実行中にリモート通知が表示されなくなります。それでもアラートを表示する必要がある場合は、リモート通知のコンテンツを使用してローカル通知をスケジュールします。以下の例に、この方法を示します。
iOSNotificationCenter.OnRemoteNotificationReceived += remoteNotification =>
{
// リモート通知を受信したら、そのコンテンツを変更して 1 秒後に表示します。
var timeTrigger = new iOSNotificationTimeIntervalTrigger()
{
TimeInterval = new TimeSpan(0, 0, 1),
Repeats = false
};
iOSNotification notification = new iOSNotification()
{
Title = "Remote: " + remoteNotification.Title,
Body = "Remote: " + remoteNotification.Body,
Subtitle = "Remote: " + remoteNotification.Subtitle,
ShowInForeground = true,
ForegroundPresentationOption = PresentationOption.Sound | PresentationOption.Alert,
CategoryIdentifier = remoteNotification.CategoryIdentifier,
ThreadIdentifier = remoteNotification.ThreadIdentifier,
Trigger = timeTrigger,
};
iOSNotificationCenter.ScheduleNotification(notification);
};
カスタムデータの格納と取得
iOSNotification.Data を使用して通知に任意の文字列データを格納し、受信した通知から後でそのデータを取得することができます。
var notification = new iOSNotification();
notification.Data = "{\"title\": \"Notification 1\", \"data\": \"200\"}";
iOSNotificationCenter.ScheduleNotification(notification);
以下のコード例は、アプリケーションが最後に受信した通知を取得する方法を示しています。
var notification = iOSNotificationCenter.GetLastRespondedNotification();
if (notification != null)
{
var msg = "Last Received Notification: " + notification.Identifier;
msg += "\n - Notification received: ";
msg += "\n - .Title: " + notification.Title;
msg += "\n - .Badge: " + notification.Badge;
msg += "\n - .Body: " + notification.Body;
msg += "\n - .CategoryIdentifier: " + notification.CategoryIdentifier;
msg += "\n - .Subtitle: " + notification.Subtitle;
msg += "\n - .Data: " + notification.Data;
Debug.Log(msg);
}
ユーザーが通知からアプリケーションを開いた場合、iOSNotificationCenter.GetLastRespondedNotification は、その通知も返します。それ以外の場合は、null を返します。
リモート通知のカスタムデータの設定
リモート通知のペイロードにカスタムデータを設定し、iOSNotification.Data を使用してそのデータを取得することが必要な場合があります。以下の例は、ペイロードに data
として文字列を設定する方法を示しています。
{
"aps": {
"alert": {
"title": "Hello world!",
"body": "This is an example of a remote notification"
}
},
"data": "Test data"
}
data
はパッケージが検索する対象であるため、カスタムデータのキーとして正確に使用する必要があります。
画像、動画、サウンド
デフォルトでは、通知にはデフォルトのシステムサウンドが使用されます。iOSNotificationCenter.SoundType を変更することで、サウンドを無効にできます。デフォルトのサウンドの種類を使用し、サウンドファイル名を iOSNotificationCenter.SoundName に割り当てることで、カスタムサウンドを使用することができます。サウンドファイル自体は、Xcode プロジェクトに手動で追加する必要があります。ファイルの配置やサポートされる形式の詳細については、Apple のドキュメント を参照してください。
Attachment を使用して、通知に画像や動画を追加することができます。