Xamarin.iOS でグループ化された通知
既定では、iOS 12 では、アプリのすべての通知がグループに配置されます。 ロック画面と通知センターには、最新の通知が上部に積み重なってこのグループが表示されます。 ユーザーはグループを展開して、グループに含まれるすべての通知を表示したり、グループ全体を無視したりすることができます。
アプリはスレッドごとに通知をグループ化できるため、ユーザーは関心のある特定の情報を簡単に見つけて操作できます。
承認を要求し、フォアグラウンド通知を許可する
アプリは、ローカル通知を送信する前に、そのアクセス許可を要求する必要があります。 サンプル アプリの AppDelegate
では、FinishedLaunching
メソッドは次のアクセス許可を要求します。
public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
UNUserNotificationCenter center = UNUserNotificationCenter.Current;
center.RequestAuthorization(UNAuthorizationOptions.Alert, (bool success, NSError error) =>
{
// Set the Delegate regardless of success; users can modify their notification
// preferences at any time in the Settings app.
center.Delegate = this;
});
return true;
}
UNUserNotificationCenter
の Delegate
(上記で設定) では、WillPresentNotification
に渡された完了ハンドラーを呼び出すことによって、フォアグラウンド アプリで受信通知を表示するかどうかを決定します。
[Export("userNotificationCenter:willPresentNotification:withCompletionHandler:")]
public void WillPresentNotification(UNUserNotificationCenter center, UNNotification notification, System.Action<UNNotificationPresentationOptions> completionHandler)
{
completionHandler(UNNotificationPresentationOptions.Alert);
}
UNNotificationPresentationOptions.Alert
パラメーターは、アプリでアラートが表示される必要がありますが、サウンドを再生したりバッジを更新したりしないことを示します。
スレッド通知
サンプル アプリの [Alice を含むメッセージ] ボタンを繰り返しタップして、Alice という名前のフレンドとの会話の通知を送信します。 この会話の通知は同じスレッドの一部であるため、ロック画面と通知センターでそれらはまとめてグループ化されます。
別のフレンドとの会話を開始するには、[新しいフレンドの選択] ボタンをタップします。 この会話の通知は別のグループに表示されます。
ThreadIdentifier
サンプル アプリが新しいスレッドを開始するたびに、一意のスレッド識別子が作成されます。
void StartNewThread()
{
threadId = $"message-{friend}";
// ...
}
スレッド通知を送信するには、サンプル アプリで次の手順を実行します。
- アプリが通知を送信する承認を受けているかどうかを確認します。
- を作成します通知のコンテンツの
UNMutableNotificationContent
オブジェクトと以下を設定します:ThreadIdentifier
を上記で作成したスレッド識別子に設定します。 - 要求を作成し、通知をスケジュールします。
async partial void ScheduleThreadedNotification(UIButton sender)
{
var center = UNUserNotificationCenter.Current;
UNNotificationSettings settings = await center.GetNotificationSettingsAsync();
if (settings.AuthorizationStatus != UNAuthorizationStatus.Authorized)
{
return;
}
string author = // ...
string message = // ...
var content = new UNMutableNotificationContent()
{
ThreadIdentifier = threadId,
Title = author,
Body = message,
SummaryArgument = author
};
var request = UNNotificationRequest.FromIdentifier(
Guid.NewGuid().ToString(),
content,
UNTimeIntervalNotificationTrigger.CreateTrigger(1, false)
);
center.AddNotificationRequest(request, null);
// ...
}
同じスレッド識別子を持つ同じアプリからのすべての通知は、同じ通知グループに表示されます。
Note
リモート通知でスレッド識別子を設定するには、通知の JSON ペイロードに thread-id
キーを追加します。 詳細については、Apple のリモート通知の生成に関するドキュメントを参照してください。
SummaryArgument
SummaryArgument
は、通知が属する通知グループの左下隅に表示される概要テキストに通知がどのように影響するかを指定します。 iOS では、同じグループ内の通知から概要テキストが集計され、全体的な概要の説明が作成されます。
サンプル アプリでは、概要引数としてメッセージの作成者が使用されます。 このアプローチを使用すると、Alice を含む 6 つの通知のグループの概要テキストが、Alice と私からのさらに 5 つの通知になる場合があります。
スレッド化されていない通知
サンプル アプリの [予定リマインダー] ボタンをタップするたびに、さまざまな予定のリマインダー通知のいずれかが送信されます。 これらのリマインダーはスレッド化されていないため、ロック画面と通知センターのアプリケーション レベルの通知グループに表示されます。
スレッド化されていない通知を送信するために、サンプル アプリの ScheduleUnthreadedNotification
メソッドは上記と同様のコードを使用します。
ただし、UNMutableNotificationContent
オブジェクトで ThreadIdentifier
は設定されません。