WWDC Quick Look 💓 By SwiftGGTeam
Expand your SiriKit Media Intents to more platforms

Expand your SiriKit Media Intents to more platforms

元の動画を見る

ハイライト

2020 年には、SiriKit メディア インテントが HomePod と tvOS 14 に拡張され、新しい代替 UI、アプリ内インテント処理、アプリの事前ウォーミングが追加され、メディア アプリが Siri 内で代替結果を提供し、より速く再生を開始できるようになります。


主要内容

音楽、ポッドキャスト、またはオーディオ コンテンツ アプリを作成する場合、Siri リクエストで難しいのは通常、再生ボタンではありません。ユーザーは、「特定のアルバムの曲を再生して」などの自然言語を話しています。アプリはこの文を実際のメディア アイテムに解析し、できるだけ早く再生を開始する必要があります。以前は、一致が間違っていた場合、コンパクトな Siri UI は最初の結果を直接再生することしか開始できず、ユーザーは曲を変更したい場合にアプリを開かなければならないことがよくありました。

このセッションでは、まずプラットフォームの範囲を拡大します。 HomePod は同じメディア インテントを使用し、新しいクラウド再生 API と連携して家庭のシナリオに適応します。 tvOS 14 は SiriKit Media Intents もサポートします。 TVアプリで対応できるもの INPlayMediaIntent iOS アプリと同様に、ユーザーは Siri を使用して大画面でコンテンツを直接リクエストできます。

2 番目の変更は代替 UI です。アプリは複数の候補メディア アイテムを一度に返すことができます。 Siri は最初の結果を最初に再生し、その後の候補を「おそらくあなたが望んでいる」メニューに配置します。ユーザーが代替アイテムをクリックすると、Siri はメディア アイテムを INPlayMediaIntent に渡されました handleとなり、開発者は元の再生パスを引き続き使用できます。

最後に起動時のパフォーマンスです。 2020 年には 2 つの新しいパスが追加されます。アプリ内インテント処理は、解決、確認、アプリ プロセスへの処理を移動します。アプリの事前ウォーミングにより、拡張機能を使用するアプリをより早く開始し、認証情報とプレーヤーを事前に準備できるようになります。どちらの目標も同じです。ユーザーがリクエストを完了してからコンテンツの再生が開始されるまでの待ち時間を短縮することです。

詳細

HomePod と tvOS 14 拡張機能

(01:00)

HomePod は同じメディア インテントのセットを使用し、新しいクラウド再生 API を導入します。このセッションでは HomePod 側のコードは表示されませんが、developer.apple.com/siri にある開発者プログラム情報を指します。実際的な結論は次のとおりです。サービスを HomePod に接続したい場合は、まずメディア検索、ユーザー アカウント、クラウド再生リンクがローカル アプリ UI なしで完了できることを確認する必要があります。

(02:25)

tvOS のアクセス方法は、iOS のインテント拡張のアイデアを再利用します。核となるエントリーポイントは依然として resolveMediaItemsを受け取ります INPlayMediaIntent 自然言語リクエストから特定のメディア アイテムを検索します。

func resolveMediaItems(for intent: INPlayMediaIntent, with completion: @escaping ([INPlayMediaMediaItemResolutionResult]) -> Void) {
}

キーポイント:

  • INPlayMediaIntent Siri によって解析された再生リクエストです。
  • resolveMediaItems リクエストをアプリ内で再生できるメディア アイテムに変換する責任があります。
  • 完了は解決結果を返し、Siri はこれらの結果に基づいてハンドル ステージに入り続けます。

(03:03)

tvOS 上のユーザーは通常、一度に 1 つのフォアグラウンド アプリのみを操作するため、セッションが戻ることをお勧めします。 .continueInApphandle アプリをフォアグラウンド モードで起動して再生を開始できるようにします。

func handle(intent: INPlayMediaIntent, completion: (INPlayMediaIntentResponse) -> Void) {
  completion(INPlayMediaIntentResponse(code: .continueInApp, userActivity: nil))
}

キーポイント:

  • handle 実際に再生を開始する前の応答段階です。
  • .continueInApp バックグラウンドで処理するだけでなく、アプリへの入力を続行するようにシステムに指示します。
  • userActivity 渡される nil この例は再生パスの切り替えのみを示しているためです。

代替 UI

(05:24)

以前の方法では、メディア アイテムのみが返されました。 Siri はこの結果を再生することしかできません。

INPlayMediaMediaItemResolutionResult.success(with: mediaItems[0])

キーポイント:

  • success(with:) は単数形の API です。
  • 戻り値は、解決されたメディア アイテム 1 つだけです。
  • コンパクトな Siri UI には、代替案を表示するのに十分な情報がありません。

(05:40)

2020 年の新機能である Plural API は、複数のメディア アイテムを返すことができます。最初の項目が再生され、後続の項目が代替として表示されます。

INPlayMediaMediaItemResolutionResult.successes(with: mediaItems)

キーポイント:

  • successes(with:) メディアアイテムの配列を受け取ります。
  • 配列の最初の要素は引き続きデフォルトの再生結果です。
  • 後続の要素は、Siri の「Maybe You Wanted」代替結果インターフェイスに入ります。

(06:37)

サンプル App ControlAudio の変更点は次の点に焦点を当てています。 resolveMediaItems。まず取り出します mediaSearch インテントから取得し、検索結果を一度に複数解像度 API に渡します。

func resolveMediaItems(for intent: INPlayMediaIntent, with completion: @escaping ([INPlayMediaMediaItemResolutionResult]) -> Void) {
    let mediaSearch = intent.mediaSearch
    resolveMediaItems(for: mediaSearch) { optionalMediaItems in
        guard let mediaItems = optionalMediaItems else {
            return
        }
        completion(INPlayMediaMediaItemResolutionResult.successes(with: mediaItems))
    }
}

キーポイント:

  • intent.mediaSearch ユーザーリクエストに対する Siri の構造化メディア検索基準です。
  • 内層 resolveMediaItems(for: mediaSearch) アプリ独自の検索ロジックを表します。
  • guard let mediaItems 検索結果がない場合は空のデータを送信しないでください。
  • successes(with:) は、代替 UI をトリガーする重要な変更です。

(06:07)

ユーザーが代替モデルをクリックした後は、新しいコールバック モデルは必要ありません。 Siri は選択したメディア アイテムを INPlayMediaIntent に渡されました handle、アプリは既存の再生ロジックに従って処理を続けます。

func handle(intent: INPlayMediaIntent, completion: (INPlayMediaIntentResponse) -> Void) {
  completion(INPlayMediaIntentResponse(code: .handleInApp, userActivity: nil))
}

キーポイント:

  • 代替選択後のエントリーはまだです handle
  • .handleInApp アプリが独自のプロセスで再生を処理できるようにすることを意味します。
  • コードでは、「最初のヒット」プロセスと「ユーザーが選択した代替」プロセスを区別する必要はありません。

アプリ内インテントの処理とアプリのプリウォーミング

(08:28)

アプリ内インテント処理は、最初にインテント拡張機能を起動してからアプリを起動するのではなく、インテント処理ステージをアプリ内に移動します。これにより、開始するプロセスが 1 つ減り、解決フェーズの早い段階でネットワーク リクエストを開始したり、認証情報を取得したり、プレーヤーを準備したりすることもできます。

セッションでは、完成したアプリは拡張機能よりも重いことも思い出させます。アプリ内インテント処理を使用する場合、解決フェーズ中の Siri の応答速度を確保するためにアプリの起動パスを最適化する必要があります。

(10:24)

拡張機能の使用を続ける場合、アプリのプレウォーミングによりアプリがより早く開始される可能性があります。予熱ロジックは次の場所に配置する必要があります。 application(_:didFinishLaunchingWithOptions:)、認証情報やプレーヤーの準備など。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Locate any app prewarming logic in this method -- fetch credentials, get audio player ready, etc.
    return true
}

キーポイント:

  • アプリ起動入り口で予熱が発生します。
  • セッションで示された例は、認証情報を取得し、オーディオ プレーヤーを準備することです。
  • インテント解決ロジックを拡張機能内に残すことができるため、このパスは、拡張機能アーキテクチャがすでにあるアプリに適しています。

重要ポイント

テレビ音声オンデマンド入口

  • 対処法: Siri の再生アクセスを tvOS 音楽、ポッドキャスト、またはビデオ アプリに追加すると、ユーザーがテレビ上でコンテンツ、バンド、または曲の名前を直接話すことができるようになります。
  • 実行する価値がある理由: tvOS 14 は SiriKit Media Intents をサポートしており、セッションでは tvOS のアクセス手順が iOS と同じであると明確に述べられています。
  • 開始方法: 既存のものを再利用します。 INPlayMediaIntent ロジックを解析し、tvOS ターゲットでインテント拡張を完了して、戻り値を返します。 .continueInApphandle

検索結果の代替メニュー

  • 内容: ユーザーが複数の曲、複数のポッドキャスト エピソード、または同じ名前のアルバムに一致する可能性のある一致をリクエストしたときに、Siri に候補を表示します。
  • 価値がある理由: 代替 UI を使用すると、ユーザーはコンパクトな Siri UI で結果を変更できるため、アプリを開く回数が減ります。
  • 開始方法: 単数形を変更します success(with:) 複数に successes(with:)、最も可能性の高いメディア項目を配列の最初に置きます。

プレイ前にリンクをウォームアップしてください

  • やるべきこと: ユーザー認証情報を取得するか、プレーヤーを初期化するか、Siri が再生を開始するよう要求する前にオーディオ セッションを準備します。
  • 実行する価値がある理由: セッションでは、アプリの事前ウォーミングの一般的なシナリオとして、認証情報の取得とオーディオ プレーヤーのセットアップが使用されます。
  • 開始方法: エクステンションを使用し続ける場合は、軽い予熱を入れてください。 application(_:didFinishLaunchingWithOptions:);アプリ内インテント処理に切り替える場合は、必要なリクエストを解決ステージに進めます。

HomePod のアクセス評価

  • やるべきこと: オーディオ サービスの HomePod アクセス リストを整理し、アカウント、メディア検索、クラウド再生パスがローカル UI なしで機能できるかどうかを確認します。
  • 実行する価値がある理由: HomePod は同じメディア インテントを使用し、クラウド再生 API を通じて家庭での再生シナリオに適応します。
  • 開始方法: まず、セッション リソースにある HomePod アクセス アプリケーション リンクと SiriKit オーディオ管理ドキュメントを読み、次に既存のメディア検索ロジックを使用して、Siri リクエストが安定して一意または複数の候補を返せるかどうかを確認します。

関連セッション

コメント

GitHub Issues · utterances