Notification Category(通知カテゴリ)は、プッシュ通知を種類ごとにグループ化し、カスタムアクションを追加するためのiOSメカニズムです。カテゴリは、通知に対して3D Touchまたは長押しを行ったときに表示されるボタンと、システムがこのタイプの受信通知を処理する方法を決定します。Appleデベロッパードキュメントによると、UNNotificationCategoryはUNUserNotificationCenterに登録され、APNSペイロードのcategoryフィールドを介して通知にリンクされます。
重要なポイント
Notification CategoryはiOS 8.0以降の機能で、開発者がプッシュ通知を分類し、インタラクティブなアクションを追加できるようにします。ユーザーが通知を受け取り、強く押す(3D Touch)か長押しすると、カテゴリによって定義されたボタンが表示されます。これにより通知がインタラクティブになり、ユーザーはアプリを開かずにアクションを実行できます。
カテゴリはUNNotificationCategoryオブジェクトを使用して登録され、識別子、アクションの配列、オプションの表示パラメータが含まれます。システムはAPNSペイロードのカテゴリ識別子を使用して、登録されたカテゴリを見つけ、対応するボタンを表示します。
AndroidのNotification Channelとは異なり、iOS Categoryは重要度、サウンド、バイブレーションを管理しません。その唯一の目的は、通知にインタラクティブ機能を提供することです:返信、確認、キャンセル、またはテキスト入力ボタン。
iOSでプッシュ通知を表示するためにカテゴリは必須ではありません。通知は常に表示されます—カテゴリが登録されていればボタン付きで、なければボタンなしで。カテゴリは通知にインタラクティブ性を追加するためだけに必要です。
カテゴリメカニズムは4つの段階で構成されます:クライアントでのカテゴリ登録、カテゴリ付きAPNSペイロードの送信、システムによるカテゴリの認識、ユーザーアクションの処理。
カテゴリのアクションには2つのタイプがあります:foreground(アプリを開く)とbackground(バックグラウンドで実行)。バックグラウンドアクションの場合、アプリはUNNotificationActionHandlerでの処理に制限時間(約30秒)を与えられます。
UNNotificationCategoryはoptionsパラメータを介していくつかのオプションをサポートしています:customDismissAction — 通知をスワイプして消したときのイベントを受け取る、allowInCarPlay — CarPlayでアクションを表示する、hiddenPreviewsBodyPlaceholder — 非表示プレビューのカスタムプレースホルダーテキスト。
iOSは通知カテゴリに2種類のアクションを提供します。各タイプには独自の目的とユーザーとの対話方法があります。
| タイプ | クラス | 説明 | 例 |
|---|---|---|---|
| シンプルアクション | UNNotificationAction | タイトルとオプション(destructive、foreground、authenticationRequired)を持つボタン | “削除”、“表示” |
| テキスト入力 | UNTextInputAction | プレースホルダー付きのテキスト入力フィールドを開くボタン | “返信”、“コメント” |
UNTextInputActionはiOSのユニークな機能です。ユーザーが“返信”ボタンをタップすると、システムはテキストフィールドを表示し、ユーザーが返信を入力します。入力されたテキストはアクション識別子とともにデリゲートに渡されます。これにより、アプリを開かずにクイック返信を実装できます。
アクションオプション:options.authenticationRequired — デバイスのロック解除が必要、options.destructive — ボタンを赤く強調表示(危険なアクション用)、options.foreground — タップ後にアプリを開く。
カテゴリはアプリ起動時に登録され、通常はdidFinishLaunchingWithOptionsメソッドで行われます。登録はUNUserNotificationCenterを介して、通知許可をリクエストした後に行われます。カテゴリは起動のたびに更新できます—古いバージョンは新しいものに置き換えられます。
import UserNotifications
class AppDelegate: UIResponder, UIApplicationDelegate {
func registerNotificationCategories() {
let replyAction = UNTextInputNotificationAction(
identifier: "reply",
title: "返信",
options: [.foreground],
textInputButtonTitle: "送信",
textInputPlaceholder: "メッセージを入力..."
)
let deleteAction = UNNotificationAction(
identifier: "delete",
title: "削除",
options: [.destructive]
)
let messageCategory = UNNotificationCategory(
identifier: "message",
actions: [replyAction, deleteAction],
intentIdentifiers: [],
options: [.customDismissAction]
)
UNUserNotificationCenter.current()
.setNotificationCategories([messageCategory])
}
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
UNUserNotificationCenter.current().delegate = self
registerNotificationCategories()
return true
}
}
カテゴリを登録した後、APNSペイロードにcategory = “message”を含む通知は、“返信”と“削除”ボタンを表示します。タップ処理はuserNotificationCenter:didReceive responseで行われ、actionIdentifierが押されたボタンを特定します。
ユーザーがカテゴリボタンをタップすると、iOSはUNNotificationResponseオブジェクトを伴ってUNUserNotificationCenterDelegateを呼び出します。response.actionIdentifierにはタップされたボタンの識別子が含まれ、response.notification.request.content.userInfoにはペイロードからのカスタムデータが含まれます。
AndroidのNotification Channelに慣れている開発者は、しばしばこれらをiOSのNotification Categoryと混同します。名前は似ていますが、これらのメカニズムは異なるタスクを解決し、異なる方法で動作します。
両方のプラットフォームで両方のメカニズムを組み合わせることができます:Androidでは通知はNotificationCompatのアクションを持つチャネルに属することができ、iOSではカテゴリがチャネルを補完します。iOSではチャネルはthread-idと呼ばれ、通知センターで通知をグループ化するために使用されます。
通知にカテゴリボタンを表示するには、サーバーがAPNSペイロードにcategoryキーを含める必要があります。このキーがないと、システムは通知にどのカテゴリを適用するかわかりません。
{
"aps": {
"alert": {
"title": "新しいメッセージ",
"body": "アンナ:こんにちは!元気ですか?"
},
"category": "message",
"thread-id": "chat_123",
"badge": 5,
"sound": "default"
}
}
categoryキーは、クライアントでsetNotificationCategoriesを介して登録された識別子と完全に一致する必要があります。大文字小文字は区別されます—“message”と“Message”は異なるカテゴリと見なされます。カテゴリが見つからない場合、通知はボタンなしで表示され、ログにエラーは記録されません。
サーバーがクライアントに登録されていないカテゴリで通知を送信した場合、iOSはカテゴリを無視し、通知をボタンなしで表示します。エラーはログに記録されず、アプリは不一致を知ることはありません。サーバーとクライアント間でカテゴリリストを同期することをお勧めします。
iOSで通知カテゴリを設計する際は、1カテゴリ=1シナリオの原則に従ってください。各カテゴリは特定の種類のインタラクションに対応する必要があります:メッセージへの返信、アクションの確認、リクエストの拒否。1つのカテゴリに異なるシナリオを混在させないでください。
アプリを開かずにテキストを入力する必要があるシナリオ(メッセージングの返信、コメント、クイックメモ)ではUNTextInputActionを使用します。テキストアクションはエンゲージメントを高めます—ユーザーはアプリ内で5回以上のタップではなく、2回のタップで意味のあるアクションを実行します。
危険なアクション(削除、ブロック)にはdestructiveオプションを使用します。iOSはこれらのボタンを赤く強調表示し、アクションの取り返しのつかなさをユーザーに警告します。デバイスのロック解除が必要なアクション(個人データの表示)にはauthenticationRequiredを指定します。
さまざまなデバイスでカテゴリをテストしてください:3D Touch対応iPhone、3D Touch非対応iPhone(長押し)、iPad、Mac。Appleプラットフォーム間でカテゴリの動作がわずかに異なる場合があります。CarPlayには特に注意してください:カテゴリボタンは車の画面に表示され、ドライバーの安全のために最小限のテキストで設計する必要があります。
よくある質問
制限はありません—iOSはUNNotificationCategoryの数に制限を設けていません。ただし、実際には、デリゲート処理を複雑にしないために10~15個以下のカテゴリを使用することをお勧めします。各カテゴリには最大4つのアクション(ボタン)を含めることができます。4つを超えるアクションはシステムによって無視されます。
UNUserNotificationCenterDelegateプロトコルとdidReceiveメソッドを実装します。response.actionIdentifierを確認します:UNNotificationDismissActionIdentifier — スワイプで閉じる、UNNotificationDefaultActionIdentifier — 本文をタップ、またはカスタムボタン識別子。テキスト入力ボタンの場合、テキストはresponse.userTextから取得できます。
Category — 通知のインタラクティブアクション(ボタン)を定義します。Thread-id — 通知センターで通知をトピックごとにグループ化します。両方のキーはAPNSペイロードで指定されます。Categoryとthread-idは関連していません:通知にカテゴリがあってもthread-idがなくても構いません。その逆も同様です。
はい、UNNotificationCategoryはmacOS 10.14+(Mojave)でUserNotificationsフレームワークを使用するアプリでサポートされています。macOSでのカテゴリの動作はiOSと同様です:通知をクリックするとボタンが表示され、処理はUNUserNotificationCenterDelegateを介して行われます。
setNotificationCategoriesを介してアプリの起動ごとにカテゴリを登録することをお勧めします。システムは呼び出しのたびに古いカテゴリセットを新しいものに置き換えます。更新しない場合、カテゴリは起動間で保持されますが、コードが変更されると、古いカテゴリが予期しない動作を引き起こす可能性があります。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。