見出し画像

iOSアプリとSiriをつなげるSiri Event Suggestionsについて

こんにちは!iOSアプリエンジニアの高橋です。
本記事ではWWDC 2019で紹介されたアプリとSiriを連携させてカレンダー保存の提案などができるSiri Event Suggestionsについて実装したサンプルコードを含め紹介していきます。

1. Siri Event Suggestionsとは?

Siri Event Suggestionsとは、アプリからSiriにイベント情報を知らせることでSiri側からイベントに関するアクションの提案やアプリケーションとの連携(出発時間のお知らせやマップでの道案内を提案)ができるフレームワークになります。
例えば、映画のチケットを購入した際にSiriに映画情報や上映日時を知らせることで、Siriから「○月○日に映画の予定がありますがカレンダーに登録しますか?」と提案してくれる様になります。

2. 使用できるシチュエーション

スクリーンショット 2020-02-19 20.01.20

Siri Event Suggestionsは、便利ではありますがシチュエーションが分かれており、必要な情報も違うためメソッド名も分かれていきます。シチュエーションのパターンとして、上記画像の7パターンに分かれていますので用途に合った使い方が必要になります。

3. 実装

ここでは実装方法について紹介していきます。
「ボタンを押した時にSIriにイベント情報を渡す」サンプルアプリを作成していきます。

画像3

3-1. info.plistを設定する

予約情報をSiriと共有するため以下の様にを設定を行います。

スクリーンショット 2020-02-20 12.02.14

3-2. Siriに予約情報を共有する

予約情報
カテゴリ:映画
映画タイトル:パラサイト半地下の家族
チケットID:A123456
開始/終了時間:適当に設定(サンプルでは2020年3月24日18:00-21:00)
import UIKit
// Siriと情報を共有するために必要
import Intents

class ViewController: UIViewController {

  // 事前情報
  // チケットID
  let ticketId = "A123456"
  // 映画タイトル
  let movieTitle = "パラサイト 半地下の家族"
  // 開始時間
  let startAt = DateComponents(calendar: .current, 
                             year: 2020, month: 3, day: 24, hour: 18)
  // 終了時間
  let endAt = DateComponents(calendar: .current, 
                             year: 2020, month: 3, day: 24, hour: 21)
  // 予約日
  let bookingTime = Date()
  // 予約者名
  let reservationHolderName = "予約者の名前"
   
   override func viewDidLoad() {
       super.viewDidLoad()
   }
   
   /// ボタンタップ時のアクション
   @IBAction func addEventToSiriButton(_ sender: Any) {
       
       // 予約情報をSiriに共有する
       donateReservationToSiri()
       
   }
}

donateReservationToSiri()内の処理

// iOS13以上でサポートされている
if #available(iOS 13.0, *) {
   
   // 識別子の設定
   // vocabularyIdentifier: チケット番号や予約IDなど固有な文字列を設定する
   // spokenPhrase: Siriによって識別されるフレーズ
   let itemReference = INSpeakableString(vocabularyIdentifier: ticketId,
                                         spokenPhrase: "Movie Ticket",
                                         pronunciationHint: nil)
   
   // スケジュール範囲を設定
   let reservationDuration = INDateComponentsRange(start: startAt,
                                                   end: endAt)
   // 予約情報を設定
   let movieTicketedEvent: INTicketedEvent = INTicketedEvent(category: .movie,
                                                             name: movieTitle,
                                                             eventDuration: reservationDuration,
                                                             location: nil)
   
   // 識別子と予約情報を合わせる
   let reservationEvent = INTicketedEventReservation(itemReference: itemReference,
                                                     reservationNumber: nil, 
                                                     bookingTime: bookingTime,
                                                     reservationStatus: .hold,
                                                     reservationHolderName: reservationHolderName,
                                                     actions: nil,
                                                     reservedSeat: nil,
                                                     event: movieTicketedEvent)
   
   // userActivityに設定をすればチェックインなどのショートカットに表示することができる
   let intentResponse = INGetReservationDetailsIntentResponse(code: .success,
                                                              userActivity: nil)
   intentResponse.reservations = [reservationEvent]

   let intent = INGetReservationDetailsIntent(reservationContainerReference: itemReference,
                                              reservationItemReferences: nil)
   let interaction = INInteraction(intent: intent,
                                   response: intentResponse)
   // Siriに予約情報を共有する
   interaction.donate { error in
       if let error = error {
           print(error)
       }
   }
}

※ iPhoneシミュレータでは動作確認できない様なので、実機で確認する必要があります。

上記サンプルコードを実行して、ボタンを押した時にSiriからのPush通知が確認できれば成功です。通知をタップしてSiriからの通知であることを確認できます。

スクリーンショット 2020-02-21 11.34.52

4. 良い点と注意点

実際にSiri Event Suggestionsを使用してみて感じたことをまとめていきます。

■ 良い点

4-1. カレンダー保存時にユーザーの許可承認が必要ない
通常iOSアプリからiPhoneカレンダーに保存処理を行う際には、EventKitなどを使用して、ユーザーに対してカレンダーへのアクセス許可を得る必要があります。Siri Event Suggestionsでは、アプリから直接カレンダーへアクセスしないため、許可確認は不要となります。また、コード上も許可状態による分岐処理を書かなくて良くなるのも嬉しい点ではあります。

4-2. Push通知をしてくれるので便利
Siri に予約情報を共有するだけで、Push通知も自動で行ってくれます。また、同じ予約情報に関しては複数Push通知することはなく自動で制御してくれる様です。UserNotificationsなどで実装する場合は、自分で制御する必要があるためとても助かります。

■ 注意点

4-3. カレンダータイトルに予約カテゴリーが勝手に挿入されてしまう
例えば、映画カテゴリで処理を実行すると、カレンダーには設定したタイトルに加えて「映画:設定したタイトル名」の様に勝手に挿入されてしまいます。用途が合っていれば問題ないのですが、試したところ消せない様なので邪魔に感じるケースもあると思います。

スクリーンショット 2020-02-21 3.03.47

5. 最後に

最後になりますが、スペースマーケットで一緒にサービスを育てたい!作りたい!と思っていただけた方は下記の採用サイトから詳細をご覧ください!


この記事が気に入ったらサポートをしてみませんか?