🕌

Apple Intelligence時代のApp Intents設計

2024/06/18に公開

はじめに

本記事は、WWDC24の "Design App Intents for system experiences" (システムエクスペリエンスのためのApp Intents設計) というセッションを記事形式にしたものです [1]

https://developer.apple.com/videos/play/wwdc2024/10176/

App Intents power system experiences in controls, Spotlight, Siri, and more. Find out how to identify the functionality that’s best for App Intents, and how to use parameters to make these intents flexible. Learn how to use App Intents to allow people to take action outside your app, and see examples of when to navigate into your app to show contextual information.
(App Intentsは、コントロール、Spotlight、Siriなどのシステムエクスペリエンスを強化します。App Intentsに最適な機能を特定する方法と、パラメータを使ってこれらのIntentsを柔軟にする方法をご覧ください。App Intentsを使用して、アプリの外でユーザーがアクションを起こせるようにする方法と、アプリにナビゲートしてコンテキスト情報を表示する場合の例をご覧ください。)
- セッション概要より

タイトルや概要を読んでもあまりピンとこなかったのですが、実際に中身を見てみると一気に引き込まれました。

要は

  • 「アプリのどの機能をApp Intentsにすべきか」
  • 「App Intentsをどのように構成すべきか」

という重要な2点について、実例をベースに解説してくれているセッションです。

App Intentsは以前からあるものですが、今回のApple Intelligenceの発表を機に対応を検討するデベロッパーも多いかと思います。私もその1人ですが、そういうケースでまさにこの2つの疑問を抱くのではないでしょうか。その回答となるのが本セッションです。多くの開発者に役立つ内容だと思ったので、まとめてみることにしました。

従来はこうだったけどiOS 18からはこうしよう!というApple Intelligenceを前提としたガイダンスなので、本記事のタイトルは「Apple Intelligence時代の〜」としました [2]

Intro

今日は、優れたApp Intentをデザインする方法について説明します。

Spotlightの5分タイマー設定から、

3

新しいフリーフォームボードを作成するためのショートカットを実行することまで、App Intentは、アプリの機能をアプリの外のシステムに表面化します。

Spotlightに加えて、App Intentは、アクション・ボタン、Squeeze、ウィジェット、コントロール、Siriを含むシステム・エクスペリエンスにアプリを開きます。

5

また、App IntentsはShortcutsアプリのアクションとしても表示され、ユーザーは自分のカスタムショートカットを作成するために、それを探したり、リミックスしたり、追加したりすることができます。

7

現在、多くのアプリから数百のApp Intentがあります、

ここでは、そのアプリを超えたシステムでの新しい体験をアンロックしたものをいくつか紹介します。これらのApp Intentを使えば、Appleのエコシステム全体で、これまで以上に多くのことができる体験を生み出すことができます。

App Intentはどのようなものか

しかし、App Intentとはどのようなものでしょうか?ShortcutsにおけるFinderのApp Intentを見てみましょう。

App Intentは、そのアプリが何をするのかを要約したものです、

13

Appで始まり、動詞が続き、インテント実行前にユーザーが入力する必要のあるパラメータが含まれる。

17

App Intentは、他のインテントと組み合わせて、単独ではできない強力な新しいフローを作成するための新しい方法でショートカットにすることができます。そして、これらすべてのエクスペリエンスでうまく機能するように、App Intentをどのように設計すべきかについて、ガイダンスを更新しました。

アジェンダ

  • Which App Intents to make(どのApp Intentsを作成するか)

まず、あなたのアプリからどの機能を表面化させるべきかについて説明します。

  • Structuring App Intents(App Intentの構成)

次に、App Intentをどのように構成するかについて詳しく説明します。

どのApp Intentを作成するか

まず、どのApp Intentを作るかについて説明します。

以前は、App Intentは、アプリの中で最も習慣的なタスクであり、アプリの外でも役に立つ可能性があるものを想定していました。つまり、アプリはいくつかのApp Intentしか持たないことが想定されていたのです。

iOS 18では、このガイダンスを一般的な機能を超えるものに変更します。

24

今、あなたのアプリが行うことはすべて、App Intentであるべきです。初めてApp Intentを作成する場合でも、アプリで最も一般的で習慣的な機能を優先することができます。しかし、柔軟なApp Intentの豊富なセットと、不明確でもろいApp Intentとの間にはバランスがあることを覚えておくことが重要です。

まずはじめに、Shortcutsアプリにあるいくつかの異なるタイプのインテントを紹介します。

26

これらの動詞で始まるインテントは、アプリのどのタイプの機能をApp Intentに表示するかを決定する際に、まず始めるべき基本的なタイプのインテントです。

同じタスクに対して複数の異なるインテントを作成することは避けましょう。

31

たとえば、異なるリマインダーを開くために複数のApp Intentを作成しようと考えている場合、同じ機能のタイプごとに1つずつ作成するのはやめましょう。

33

その代わりに、アプリの機能を柔軟なインテントに構成し、リマインダーをパラメータに含めるようにします。

もう1つの注意点は、特定のUI要素のためにApp Intentを作らないようにすることです。

34

App Intentは、キャンセル・ボタンのタップやプロッターの下へのスワイプなど、特定のUI要素を排他的にトリガーすべきではありません。

これはインテントのタスクを隠してしまい、予期せぬ振る舞いをもたらすので期待できません。

40

代わりに、下書きの保存や下書きの削除など、人々が通常これらのUI要素を使用してアクセスする基本的なタスクを表すApp Intentを作成します。

さらに、アプリがライブ・アクティビティ、オーディオ再生、または録音をサポートしている場合は、バックグラウンドからこれらのことを可能にするApp Intentsを作成します。

42

これは、アプリ内でのアクションを必要としないシンプルなインテントに最適です。

App Intentの構成

Parameter types

それでは、アプリのインテントをどのように構成するかについて、パラメータ・タイプから説明しよう。

先ほど見たように、App Intentにはパラメータサマリーがあり、インテントがタスクを実行するために使用する入力が含まれています。

46

例えば、このカメラインテントはカメラを特定のカメラモードに開きます。

48

パラメータはこれらのどのカメラモードにも変更できるため、どのモードを選択しても、要約が常に文章として読めるようにすることが重要です。パラメーターの要約は、ショートカットドロワーで探索するときにアプリの意図を理解してもらうために不可欠であり、同時にパラメーターを設定するときにも読みやすさを維持します。

49

数字を選んだり、テキストを入力するなど、インテントが入力を必要とする場合は、ビルトインパラメータのライブラリから選択してください。これらは、リマインダーに日付を追加するような単純なタスクに最適です。

52

また、アプリのタブを開くなど、基本パラメータではカバーできないオプションをパラメータに含める必要がある場合は、静的パラメータを使用して、それらのタブオプションを含めることができます。tabパラメータには、以下の各タブが含まれます。

53

誰かがアプリにノートフォルダを追加したときに、さらにノートフォルダを追加するなど、時間の経過とともに変更されるオプションを含むパラメータがある場合、

54

アプリのエンティティを動的パラメータとして作成し、時間の経過とともに新しいオプションで更新されるようにします。

Optional/required parameters

パラメータが optional の場合、前もって指定しなければ、インテントはフォローアップの質問をしません。この動作が望ましい。

56

例えば、このノートApp Intentを見てみましょう。あなたが選択したノートのフォルダが表示されます。

57

このインテントを実行したが、開くフォルダを設定しなかった場合、ノートをフォルダビューに開くだけです、

58

インテントを実行するたびに開きたいフォルダを尋ねる代わりに、完全なフォルダピッキング体験を提供します。optionalなパラメータは、誰かがパラメータを設定していなくても、App Intentが即座にアクションを実行できるため、素晴らしいものです。しかし、パラメータが毎回尋ねられない限り、App Intentが全く役に立たないと感じる場合は、必須パラメータに設定することができます。

59

例えば、検索メールのインテントでは、テキスト入力が必要です。この場合、textパラメータは必須です。

60

これは、誰かがあなたのApp Intentを実行するたびに、あなたが書いたフォローアップの質問がされることを意味します。これらの質問は、ここにあるような簡潔で明確なものにしましょう。

Toggles

では、2つの状態しか持たない状態を変更するインテントを、どのように構成すべきか見てみましょう。

62

例えば、FlashlightにはsetFlashlightというApp Intentがあり、これは懐中電灯のオンかオフを設定するインテントです。インテントはこの2つの状態の間でしか変化しないからだ、

63

インテントは、デフォルトのパラメータとしてtoggleもサポートする必要があります。

64

デフォルトのパラメータとしてtoggleをサポートしなかった場合、誰かがインテントを実行するたびに、懐中電灯をオンにするかオフにするかの選択を求められます。

65

代わりに、デフォルトとしてtoggleを提供することで、インテントが尋ねることなく懐中電灯をオンまたはオフにすることができます。

Open Intents

次に、インテントの一部としてアプリを開くタイミングについて説明します。これまで、App Intentは、必要な場合を除き、アプリをフォアグラウンドに開くことを避けていました。

68

iOS 18では、アプリを開くことは、インテントがアプリに変更を加えたことを示すための一般的な動作になりました。App Intentの一部としてオープンを返すことで、人々に変更を確認するオプションが与えられます。App Intentの一部としてアプリを開くには、2つの方法があります。

70

1つ目は、App Intentが特定のビューに開くように本質的に機能している場合です。例えば、この時計App Intentはストップウォッチを開きます。

73

インテントを実行すると、時計アプリがストップウォッチに開きます。このような場合、App Intentは本来アプリを開 く機能を持つので、App Intentを開くインテントに適合させ るべきです。2つ目のケースは、App IntentがアプリUIの変更で完了したり、検索結果を表示したりする場合です。

例えば、create freeform boardインテントがある場合、

76

新しいボードが作成されたことを示すためにアプリを開くことで実行を終了するはずです。アプリ内アニメーションを追加することなく、アプリ内の新しいボードに直接アプリを開くことで、新しいフリーフォームボードに素早く取り掛かることができます。

77

この動作は、デフォルトでオンになっている実行時に開くトグルとしてインテントに表示されます。これは、いくつかのことを行うショートカットの一部としてインテントを使用したい場合、フロー内の各アプリを開かずに複数のインテントを実行したい場合に、この動作をオフに切り替える選択肢を提供します。

まとめ

79

  • アプリが実行できるタスクを含む強力なApp Intentを設計する

80

  • 多くの構成や使用ケースに渡って柔軟で読みやすいように、インテントを構造化する

  • バイナリパラメータを切り替えたり、適切なときにアプリを開いたりするオプションを与える
脚注
  1. 個人的には動画よりも記事で読むほうがスクロールしながら読みたい部分を拾い読みできて楽なので、このような形式にしておくことにしました。 ↩︎

  2. ちなみにセッションタイトルにある「システムエクスペリエンス」という用語は冒頭以降出てきません...いやしかし、UX(ユーザーエクスペリエンス)やDX(デベロッパーエクスペリエンス)に対して「システムエクスペリエンス」というのは、個人的にはなかなかいい得て妙だなと思いました。Apple Intelligence時代におけるApp Intentsというのは、まさに開発者がシステム向けに情報や機能を提供するためのインターフェースなので。 ↩︎

Discussion