能登 要

札幌在住のiOSアプリ開発者。SwiftUI により分割されたデバイス間を縦横にやりとりできる考え方に転換しています。

iOSアプリ開発者。2009年のiPhoneアプリ開発開始時期から活動。開発言語のアップデートの中でSwiftUIおよび周辺技術に着目中。

Custom Intent を理解するキーワードIntent、User Activity、Donate - Siri Intent Extension

WWDC2020のセクションとして公開される程度にはAppleはIntentについて熱心である。

Empower your intents - WWDC 2020 - Videos - Apple Developer

内容としてはIntentのチューニングに関わるIntentの実装パターンの追加についての紹介が中心となっている。

2016年にSiri Intent Extensionが追加され2020年で4年経過して幾つかのパターンが現れている。パターンを把握することでIntent について把握するのが用意となった。

1) キーワード

出てくるキーワードは、Intent、User Activity、Donateの3つとなる。

1-1) Intent(意図)

利用者にアプリの意図を提示する。意図は利用者に選択肢を与えるために作成される。作成された意図は、Siri やWidgetの設定画面(Widget Configulation)の形で利用者に体現される。

1-1-1) IntentはiOS13以前、iOS14以後を意識する アプリの意図を提示するのはiOS1まではExtension(Siri Intent Extension)経由だった。iOS14からはMultiScreen(複数画面)対応されたアプリでIntent用Screen経由でIntentを提示できる機能が追加された。Extension 経由でのIntent機能だと音楽アプリのような再生中の曲に対しての意図を提示するアプリに対しては良い利用経験が得られない問題のAppleの解決策でる。。

Note: Siriへの反応速度をチューニングするにはアプリより省サイズのExtensionを起動することで速度面で有利となるはずだった。私見だがミドルウェア導入ソフト(Cocoapods)を使うと動的リンクライブラリ(Dynamic link library)を利用するアプリとなりがちであり、動的リンクライブラリをロードするトレードオフが発生することを考えればアプリからのIntent提案の方が効率が良くなる場合が出てくる。

1-2) User Activity(ユーザーの行動)

Siriも含めユーザーの行動をアプリに伝えるイベントはUser Activity(ユーザーの行動)を介して呼び出される。

1-2-1) アプリケーションが介在する場合:

User Activityが必要となる。Intent 経由で提示された選択肢を利用者が選択すると、利用者の行動としてアプリケーションとして提供される。Siri経由での利用者の行動はアプリケーション側で受け取ることができる。

1-2-2) アプリケーションが介在しない場合:

アプリ開発者側はUser Activityを意識できない。例えばWidgetの設定画面で使用されるIntentはアプリケーションを介さずWidget Extensionにユーザーの選択が渡される。

1-3) Donate(寄付)

ショートカット機能(Siri Shortcut)でもIntent を渡して利用者に選択肢を提案する。ショートカット機能の場合は利用者にアプリそれぞれ複数の機能を提案し、それらの相互作用として動作することが求められる。相互作用の実現方法を示すとアプリがユーザーの行動を介して得られた結果を次に実行するアプリが受け取り次の処理を実行することでユーザーの要求を実現する。

相互作用に必要な機能をユーザーにショートカットに提出流れはDonate(寄付)と呼ばれる。

Donateのサンプルに関しては以前作成したサンプルがあるので試して欲しい。

GitHub - notoroid/Siridashi: Siridashi is Siri sample for iOS.

2) パターン

キーワードを示したところで用途と何度でマトリックスを示す。

Siri Intent Matrix

2-1) 基本パターン

Siri に対応する2016年のアプリ事情(アプリは常時起動していない)を考慮してExtensionで意図を提案、アプリでユーザーの行動に対応

  • Siri Intent Extension
  • Siri Intent Definitions

2-2) 複雑な応用パターン

買収したWorkflowのアプリ間連携機能をIntent、User Activityベースで整理したもの。アプリ間の相互連携を考慮するため新しいキーワード導入、エラー対処などの流れも追加されてCustom Intentの実装からは複雑さが増えている。

2-3) シンプルな応用パターン

iOS14から導入されたWidgetではIntentのみで完結する応用例が追加。Siri Intentの全体像を理解しなくても利用できる。

2-4) 基本パターンの改良

iOS14から複数画面対応のアプリからIntent を提供可能となった(In-app Intent)。2020年のアプリ事情(音楽アプリなど常時起動アプリが存在)を考慮してアプリだけでIntent の提案とUser Activityに対処可能となった。

public protocol UIApplicationDelegate : NSObjectProtocol {
    ・・・
    @available(iOS 14.0, *)
    optional func application(_ application: UIApplication, handlerFor intent: INIntent) -> Any?

    @available(iOS, introduced: 11.0, deprecated: 14.0, message: "Use application:handlerForIntent: instead")
    optional func application(_ application: UIApplication, handle intent: INIntent, completionHandler: @escaping (INIntentResponse) -> Void)
    ・・・
}

3) 雑感

発表から4年経過した2020年には実装例が提示された事でIntentに取り組むきっかけができている。

IntentがSwiftUIをはじめとするAppleが押し進めるテクノロジーの方向性の一角を担っているのではないだろうか。アプリの利用者の裾野を広げる意図から導入されたSiri Intentがさほど関係ないWIdgetKitの設定使われている点から伺える。