🍎

【iOS 18.0〜】WWDC 24: Meet AccessorySetupKit

2024/06/20に公開

はじめに

概要

AccessorySetupKitとはプライバシーを保護しながらアクセサリの検出と構成を有効にするフレームワークです。

AccessorySetupKit を使用すると、アプリによって提供される画像と名前を使用して Bluetooth または Wi-Fi アクセサリを検出し、構成できます。Bluetooth、Wi-Fi、およびローカルネットワークのアクセス許可について、シームレスでプライバシーを保護しながらユーザーの同意と制御を可能にします。AccessorySetupKit アプリは、アクセサリのペアリング削除や名前変更などの拡張アクセサリコントロールにアクセスできます。

https://developer.apple.com/documentation/accessorysetupkit

使用できるのはiOS及びiPadOSのみでwatchOSのコンパニオンアプリ[1]には同期されないとのことです。

AccessorySetupKit は iOS および iPadOS で利用できます。アクセサリの Bluetooth 権限は、コンパニオン watchOS アプリと同期されません。

Meet AccessorySetupKit

Meet AccessorySetupKitセッションでは以下の順で解説されてます。

  • Overview
  • AccessorySetupKit APIs
  • Design for AccessorySetupKit

以下セッションを翻訳して要約したものを紹介します。

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

Overview

iOS 18.0およびiPadOS 18.0では、アクセサリのセットアップエクスペリエンスをさらに向上させるために役立つ機能AccessoriesSetupKitが追加されました。
BluetoothとWi-Fiを使用してaccessoryをセットアップおよび管理するためのアプリに合理的でプライバシーに配慮したアプローチを提供する新しいフレームワークです。

APIを呼び出すだけで、新しいaccessory pickerが表示され、アプリがペアリングしたい近くのaccessoryが表示されます。
pickerには独自のアートワークとaccessoryのわかりやすい名前が表示されます。
1回のタップでaccessoryがアプリと安全にペアリングされ、すぐに使用できるようになります。

altテキスト

BluetoothとWi-Fiの両方をサポートしているaccessoryであれば、この1回のタップで両方にアクセスできるようになります。
またaccessoryとの通信に同じCoreBluetoothおよびNetworkExtension APIを引き続き使用できます。

ペアリングされた情報は「プライバシとセキュリティ」設定のAccessoriesにて確認することができます。

AccessorySetupKit APIs

ここではデジタルサイコロを設定し、出目の結果をBluetooth経由で同期するアプリを作成します。
サンプルプロジェクトは以下からDLできます。
https://developer.apple.com/documentation/accessorysetupkit/authorizing-a-bluetooth-accessory-to-share-a-dice-roll

AccessoriesSetupKit を使用するには、アプリの Info.plistにいくつかのエントリを追加します。

BluetoothをAccessoriesSetupKit-Supports配下に置きます。
続いてBluetooth Serviceなどにアクセサリを検出するためのルールを追加します。

アクセサリを使用するには以下3つのステップがあります。

  1. アクセサリの検出
  2. アクセサリの使用許可
  3. アクセサリとの通信

​AccessoriesSetupKitは検出と認証を処理しますが、通信は以前のiOSバージョンと同様にCoreBluetoothとNetworkExtensionで処理されます。

AccessoriesSetupKitで最初に遭遇するクラスはASAccessoriesSessionです。
これは、accessory pickerを表示し、イベントを通知し、accessoryを管理する中心的なオブジェクトです。

ASAccessoriesSessionにpickerを表示するよう依頼すると、ASPickerDisplayltemオブジェクトの配列が提供されます。ASPickerDisplayltemは、accessoryの名前とイメージ、およびaccessoryのスキャン方法をシステムに指示するDiscovery descriptorを定義します。

これにより、ASAccessoriesSessionでshowPickerを呼び出して、pickerプロセスでの検出と承認を開始できます。
セットアップが完了すると、アプリはセッションオブジェクト経由でASAccessoriesEventを受け取ります。
このイベントには、アプリが操作するために新しく追加されたaccessoryに関する重要な情報が含まれています。

実装する際は最初にASAccessoriesSessionを初期化します。
sessionは、アプリがsessionからのイベントを処理するために使用するeventHandlerを使用してアクティブ化されます。
ASAccessoriesEventは、session、accessory、pickerに関する更新があるたびにeventHandlerに渡されます。
さまざまなイベントがあり、eventTypeを確認することでそれらを区別できます。
アクティブ化されたイベントをシグナルとして使用すると、セッションからaccessoryプロパティを読み取ることでaccessoryをクエリしたり、新しいセットアッププロセスを開始したりできます。

表示アイテムを作成するには、製品名、製品画像、およびDiscovery descriptorが必要です。
ASDiscoveryDescriptorクラスを使用すると、必要なすべての検出ルールを1つの複合オブジェクトに結合できます。
システムは、スキャン結果を記述子内のすべてのルールと照合して、関心のあるアクセサリを正確にフィルタリングします。
ASDiscoveryDescriptorはBluetooth Service UUIDやWi-Fi SSIDなどのカスタマイズ可能なフィールドが多数あり、柔軟性が高くなります。

ダイスを検出するには、Discovery descriptorのbluetoothServiceUUIDが、ダイスによってアドバタイズされるGATTService UUID として設定されている必要があります。
ASPickerDisplayltemには、セットアップエクスペリエンスをカスタマイズするために使用できるプロパテイが他にもあります。

サンプルアプリには、アクティブ化されたsessionでshowPickerを呼び出すだけで、ピンクのサイコロと青いサイコロ用に作成した表示アイテムを渡すボタンがあります。
このとき、accessory pickerが表示され、検出とセットアップのプロセスが開始されます。

[追加】ボタンをタップすると、アクセサリピッカーがアプリの上にスライドし、ピンクのサイコロが即座に検出されて表示されます。

ここで、別のシミュレーター電話を使用して青いサイコロの電源をオンにすると検出され、左右にスワイプして、今回設定したいサイコロを選択することができます。

accessory pickerにはさまざまなBluetoothペアリングUIが表示されます。

accessoryを使用する準備ができると、アプリはAccessoriesAddedイベントを取得します。

その他のイベントには、accessoryのプロパティ(表示名など)が変更されたときに送信されるaccessoryChangedなどのイベントがあります。
表示名は「設定」で変更できます。
AccessoriesRemovedは、ユーザーまたはアプリによってaccessoryがシステムから削除されたときに送信されます。

ASAccessoriesクラスは物理的なaccessoryを表します。
これには、accessoryの認証状態、表示名、Discovery descriptor、CBPeripheralのBluetooth識別子、Wi-Fiネットワークをブロードキャストする場合のWi-Fi SSIDなどのすべてのネットワークインターフェイスが含まれます。
AccessoriesAddedイベントのASAccessoriesオブジェクトを使用するとCoreBluetoothを使用してBluetooth周辺機器に接続できます。

いつものようにCBCentralManagerを作成します。
Info.plistでAccessoriesSetupKitのサポートを宣言したため、Bluetoothの使用許可を求められることはありません。
CBCentralManager状態は、アプリがaccessoryをペアリングしている場合にのみpoweredOnになります。
bluetoothldentifier を使用してBluetooth周辺機器を取得します。
そしてもちろん、いつでもCentralManagerのスキャンAPIを使用して周辺機器をスキャンできます。
アプリとペアリングされたaccessoryのみがスキャン結果で返されます。
接続すると、そのGATT Serviceが検出され、更新を読んで通知を受け取ることができます。

AccessoriesSetupKitを使用せずに既にBluetoothの使用を承認されている場合は既存のaccessoryのBluetooth周辺機器識別子またはWi-Fi SSIDを使用してASPickerDisplayitemのサブクラスである ASMigrationDisplayitemのインスタンスを作成できます。
これらの移行項目をshowPicker呼び出しに渡して、既存のaccessoryをアップグレードして、AccessoriesSetupKitによって管理され、それらが新しいaccessory設定に表示されるようにします。

showPicker呼び出しに移行項目のみが含まれている場合は、アプリの上部に情報ページが表示され、移行について通知されます。移行アイテムを他の非移行表示アイテムと一緒に渡すことを選択した場合、移行は新しいaccessoryが検出されてセットアップされた場合にのみ行われることに注意してください。
これが、既存のaccessoryをAccessoriesSetupKitで管理できるように移行する方法です。

Design for AccessorySetupKit

accessory pickerは、製品イメージを収容するための 180x 120ポイント サイズのコンテナボックスを提供します。

すべてのスケール係数の画面で鮮明に見えるように、画像に十分なピクセル解像度があることを確認してください。
ライトモードとダークモードの両方でアセットがどのように見えるかを必ずテストしてください。

どちらのモードでも見栄えが良くなるように、画像の背景は透明にする必要があります。

アプリのUIの一部がaccessory pickerによって遮られることに注意してください。
セットアップ中に表示されない可能性があるUIを更新しないでください。
pickerDidPresentおよびpickerDidDismissイベントをリッスンして、pickerの表示と終了を追跡できます。

最後に予期しないpickerの表示を避けるために、pickerを表示する前に、新しいaccessoryの追加に関する十分なコンテキストをユーザーに示すことをお勧めします。

また、可能であれば、showPicker呼び出しをボタンにバインドして、セットアップエクスペリエンスが常にユーザーによって開始されるようにします。

まとめ

AccessoriesSetupKit はBluetoothおよびWi-Fiアクセサリをセットアップするためのまったく新しい方法で、アプリは1回タップするだけで、Bluetooth と Wi-Fiの両方でアクセサリにアクセスできるようになる。
この体験により、製品を初めて体験するときの摩擦が最小限に抑えられる。
また実装の流れとして以下まとめられてました。

  • AccessorySetupKit項目をアプリのInfo.plistに追加
  • ASAccessoriesSessionを作成し、そのアクティベーションがタスクを開始するまで待つ
  • 検出したいaccessoryごとにASPickerDisplayitemを作成
  • accessory pickerを表示してセットアッププロセスを開始し、イベントに適切に応答
  • アプリがシステムアクセスを使用して既存のaccessoryをすでに管理している場合はASMlgrationDisplayltemを使用してaccessoryをAccessoriesSetupKitに移行
  • accessory picker内で可能な限り最良の方法でaccessoryを顧客に提示できるように、アセットのデザインに注意

最後に

ペアリングの手間を少しでも軽減することはユーザー体験の向上に直接関係するのですごく良い機能と感じました。
サンプルプロジェクトも公開されているのでどこか検証を公開できるタイミングで触ってまた記事書きたいと思います。


脚注
  1. コンパニオンアプリとは、Apple Watch用のアプリとペアになっているiPhone用のアプリを指します。例えば、Apple Watchで収集したヘルスデータをiPhone上で表示するアプリなどがあります。このように、iPhoneとApple Watch間でデータを共有し、連携して動作するアプリのことをコンパニオンアプリと呼びます。 ↩︎

Discussion