[iOS 10] User Notifications framework を使用して「カスタム通知アクション付のローカル通知」を作成する

2016.06.30

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

はじめに

こんばんは。モバイルアプリサービス部の平屋です。前回の記事に引き続き、iOS 10 で追加された「User Notifications framework」のクラスを使用した実装を紹介します。

本記事では、「カスタム通知アクション付のローカル通知」を作成する実装を紹介します。

本記事は Apple からベータ版として公開されているドキュメントを情報源としています。 そのため、正式版と異なる情報になる可能性があります。ご留意の上、お読みください。

検証環境

  • Xcode Version 8.0 beta (8S128d)
  • iPhone 6s
    • iOS 10.0 (14A5261v)

カスタム通知アクション

「カスタム通知アクション」を使わない場合は、通知に対して行うことができるアクションは「非表示にする」ことだけですが、「カスタム通知アクション」を使用すれば、通知に関連した任意の処理を実行することができるようになります。

例えば、スケジュール共有アプリであれば、新規イベントが共有された時に配信される通知に「出席」や「欠席」というカスタムのアクションを追加できます。

「カスタム通知アクション」自体は iOS 8 から存在する機能ですが、本記事では「User Notifications framework」のクラスを使用して「カスタム通知アクション付のローカル通知」を作成する方法を解説します。

実装

それでは、「カスタム通知アクション付のローカル通知」を作成する方法を解説していきます。

UNNotificationAction を作成する

まずは、identifiertitleoptions から、通知のアクションを定義する UNNotificationAction を作成します。

引数 identifier はアクションの識別子で、引数 title は通知の UI 上に表示されるタイトルです。引数 options については別の記事で説明します。

// UNNotificationAction を作成
let action = UNNotificationAction(identifier:"replyActionIdentifier",
                                  title:"Reply",
                                  options:[])

UNNotificationCategory を作成する

次に通知のカテゴリを定義する UNNotificationCategory を作成します。カテゴリはアクションの集合であり、カテゴリには複数のアクションを含めることができます。

引数 identifier はカテゴリの識別子です。

引数 actionsminimalActions には UNNotificationAction の配列をセットします。通知の UI の表示領域が狭い場合は minimalActions にセットしたアクションが使用されます。そうでない場合は、actions にセットしたアクションが使用されます。actionsminimalActions は共に配列なので、複数のアクションをセットできますが、実際に有効になるアクションの数には制限があります。actions の場合は 4 つまで、minimalActions の場合は 2 つまでです。

引数 intentIdentifiersoptions については別の記事で説明します。

let category = UNNotificationCategory(identifier: "messageCategoryIdentifier",
                                      actions: [action],
                                      minimalActions: [action],
                                      intentIdentifiers: [],
                                      options: [])

UNNotificationCategory を UNUserNotificationCenter に追加する

UNNotificationCategory を UNUserNotificationCenter に追加します。

UNUserNotificationCenter.current().setNotificationCategories([category])

カスタム通知アクション付のローカル通知を作成する

第1回目の記事と同様の手順でローカル通知を作成します。

ローカル通知にカスタム通知アクションを追加するには、UNMutableNotificationContentcategoryIdentifier プロパティにカテゴリの identifier をセットします。

let content = UNMutableNotificationContent()
content.title = "Hello!"
content.body = "World!"
content.sound = UNNotificationSound.default()

// カテゴリの identifier をセットする
content.categoryIdentifier = "messageCategoryIdentifier"

let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 5, repeats: false)
let request = UNNotificationRequest.init(identifier: "ActionNotif " + self.currentDateString(), content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request)

通知アクションが選択された時のイベントを実装する

通知が配信された時に表示される「バナー形式の通知 UI」をプレス (3D Touch 対応機種の場合) または下方向へドラッグすると、通知に対して実行できるアクションが表示されます。

アクションを選択すると UNUserNotificationCenterDelegateuserNotificationCenter(_:didReceive:withCompletionHandler:) メソッドが呼ばれます。このメソッドは記事「[iOS 10] 画面上部または通知センター上に表示された通知がタップされたときの処理を実装する」で紹介しました。

引数 response から actionIdentifier を取り出すことができるので、特定のアクションに紐付いた任意の処理を行うことができます。

// 任意のオブジェクトを UNUserNotificationCenter のデリゲートにする
UNUserNotificationCenter.current().delegate = self
func userNotificationCenter(_ center: UNUserNotificationCenter,
                            didReceive response: UNNotificationResponse,
                            withCompletionHandler completionHandler: () -> Void) {
    // actionIdentifier を判別する
    if response.actionIdentifier == "replyActionIdentifier" {
        print("Selected Reply Action!!")
    }

    ...

    // 処理完了時に呼ぶ
    completionHandler()
}

さいごに

本記事では「カスタム通知アクション付のローカル通知」を作成する実装を紹介しました。

次回の記事では、今回解説を省略した「カスタム通知アクション」まわりの機能について解説する予定です。お楽しみに!

参考資料