[iOS 10] カスタム通知アクション をNotification Content app extension でハンドリングする

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは。モバイルアプリサービス部の平屋です。

本シリーズ「iOS User Notifications UI framework」では、iOS 10 で新規追加された「User Notifications UI framework」の機能を使用した実装を紹介していきます。第 1 回目の記事で「Notification Content app extension」の基本事項を解説していますのであわせてご覧ください。

第 1 回目の記事で説明した通り、Notification Content app extension は特定の通知カテゴリとともに使用します。また、通知カテゴリにはカスタム通知アクションを含めることができます。(カスタム通知アクションについてはこちらの記事などを参考にしてみてください)

通知カテゴリにカスタム通知アクションが含まれている場合に通知のカスタムビューを展開すると、以下のようにカスタムビューと共にアクションのボタンが表示されます。このボタンはシステムが自動で追加します。

user-notifications-ui-framework-3-1

本記事ではアクションが選択された時のイベントを Notification Content app extension 側でハンドリングする方法を解説していきます。

実装

アクション選択のイベントをハンドリング

カスタムビューの下に表示されるアクションが選択されたイベントをハンドリングするには、app extension の ViewController に didReceive(_:completionHandler:) メソッドを実装します。このメソッドはアクションが選択されたタイミングで呼ばれます。

// app extension の ViewController
class NotificationViewController: UIViewController, UNNotificationContentExtension {

    // ...

    func didReceive(_ response: UNNotificationResponse,
                    completionHandler completion: @escaping (UNNotificationContentExtensionResponseOption) -> Swift.Void) {
        // (1) 選択されたアクションを判別
        print("response.actionIdentifier:\(response.actionIdentifier)")

        // (2) ブロックを実行
        completion(.dismiss)
    }
}

(1) 選択されたアクションを判別

didReceive(_:completionHandler:) メソッドの引数 response からアクションの ID を取り出すことによって、どのアクションが選択されたのかを判別することができます。

(2) ブロックを実行

処理が終わったタイミングで completion ブロックを実行します。このブロックの引数の型は UNNotificationContentExtensionResponseOption であり、この enum は以下のいずれかの値をとります。

  • doNotDismiss
  • dismiss
  • dismissAndForwardAction

doNotDismiss を指定すると、アクションを選択しても通知 UI は非表示になりません。dismiss を指定すると、アクション選択後に通知 UI が非表示になります。dismissAndForwardAction を指定すると、アクション選択後に通知 UI が非表示になり、アクションが選択されたイベントが本体アプリに伝達されます。

アクション選択後に処理を完了できる場合は dismiss を、本体アプリ側に処理を委譲したい場合は dismissAndForwardAction を使用するといった使い方が考えられます。

本体アプリ側での実装

以下のいずれかを満たす場合、アクションが選択されたイベントは本体アプリに伝達されます。

  • app extension の ViewController で didReceive(_:completionHandler:) メソッドを実装していない
  • app extension の ViewController の didReceive(_:completionHandler:) メソッド内で completion ブロックに dismissAndForwardAction を渡した

アクションが選択されたイベントを本体アプリ側でハンドリングする実装についてはこちらの記事などを参考にしてみてください。

さいごに

本記事ではアクションが選択された時のイベントを Notification Content app extension 側でハンドリングする方法を解説しました。

次回の記事でも引き続き「User Notifications UI framework」の機能について解説していきます。お楽しみに!

参考資料