【iOS 18】DockKitのアップデート

DockKitはDockKit対応アクセサリを動かすためのフレームワークです。WWDC24でiOS 18から使用可能な強力なDockKit APIがいくつか追加されました。それらのAPIを使用することで、より一層DockKit対応アクセサリを柔軟に動かすことができるようになります。
本記事では、Insta360 Flow Pro & Flowを使用して、WWDC24で発表されたDockKitの新APIについて説明します。 本記事を最後までお読みいただくことで、WWDC24で発表されたDockKitの新APIをすぐに使用することができるようになります。
DockKitに初めて触れる方は先に以下の記事をお読みいただくと、本記事をスムーズにお読みいただくことができます。
インテリジェントトラッキング

インテリジェントトラッキングとは、撮影シーンで焦点の対象を自動で判断するトラッキング方法です。iOS 18からは自動で焦点の対象を決めることができます。また、ビデオフレーム内に写っている人物や物体の特徴を取得することができるようになり、特徴に応じて焦点の対象を変更することもできます。
ビデオフレーム情報の取得

ビデオフレームに関する情報を取得することができます。取得可能なビデオフレーム情報は以下の二つです。
- ビデオフレームをキャプチャした時刻を示すタイムスタンプ
- ビデオフレーム内に含まれるトラッキング対象情報
DockAccessory.TrackingStates
DockAccessory.TrackingStates はトラッキングセッション状態の非同期シーケンスです。非同期で、アクティブなトラッキングセッションを表すDockAccessory.TrackingState オブジェクトを取得することができます。
DockAccessory.TrackingState
DockAccessory.TrackingState オブジェクトには、ビデオフレームをキャプチャした時刻を示すタイムスタンプや、ビデオフレームに写っている被写体情報が格納されています。
time
DockAccessory.TrackingState オブジェクトのtime で、ビデオフレームをキャプチャした時刻を示すタイムスタンプを取得することができます。
trackedSubjects
DockAccessory.TrackingState オブジェクトのtrackedSubjects で、ビデオフレームに写っているトラッキング対象情報を表すDockAccessory.TrackedSubjectType の配列を取得することができます。
トラッキング対象情報の分析

ビデオフレーム内のトラッキング対象情報の特徴を取得することができます。取得可能なトラッキング対象情報の特徴は以下の通りです。
- 位置座標とサイズ
- 顕著性
- 発話確信の度合い
- カメラ目線の度合い
DockAccessory.TrackedSubjectType
DockAccessory.TrackedSubjectType はトラッキング対象情報を表すEnum です。以下の要素を持っています。各要素のassociated Valueでトラッキング対象の特徴を取得することができます。
| 要素 | 意味 | 
|---|---|
| object(DockAccessory.TrackedObject) | トラッキング対象がオブジェクト | 
| person(DockAccessory.TrackedPerson) | トラッキング対象が人物 | 
DockAccessory.TrackedObject
DockAccessory.TrackedObject はDockAccessory.TrackedSubjectType の要素である、object のassociated Valueです。
identifier
トラッキングされているオブジェクトに与えられる一意の識別子です。この識別子はDockKitアクセサリがオブジェクトをトラッキングする限り持続します。後述するselectSubjects(_:) の引数にこのidentifier を渡すことで、トラッキング対象を変更することができます。
rect
トラッキングされているオブジェクトのバウンディングボックスです。CGRect 型で、バウンディングボックスの位置とサイズを表しています。
saliencyRank
トラッキングされているオブジェクトの顕著性ランクです。ランクが低いほどオブジェクトの重要性が高いと判定されています。顕著性ランキングが設定されていない場合、またはオブジェクトが顕著でない場合の値はnil になります。
DockAccessory.TrackedPerson
DockAccessory.TrackedPerson はDockAccessory.TrackedSubjectType の要素である、person のassociated Valueです。
identifier
トラッキングされている人物に与えられる一意の識別子です。この識別子はDockKitアクセサリがオブジェクトをトラッキングする限り持続します。後述するselectSubjects(_:) の引数にこのidentifier を渡すことで、トラッキング対象を変更することができます。
lookingAtCameraConfidence
カメラを直接見ている人の自信を表す指標です。指標の値の範囲は0.0 から1.0 で、DockKitがスコアを計算していない場合は0.0 になります。
rect
トラッキングされている人物のバウンディングボックスです。CGRect 型
で、バウンディングボックスの位置とサイズを表しています。
saliencyRank
トラッキングされている人物の顕著性ランクです。ランクが低いほど人物の重要性が高いと判定されています。顕著性ランキングが設定されていない場合、または人物が顕著でない場合の値はnil になります。
speakingConfidence
トラッキング中に話している人の信頼度スコアです。指標の値の範囲は0.0 から1.0 で、DockKitがスコアを計算していない場合は0.0 になります。
トラッキング対象の選択
selectSubjects(_:)
selectSubjects(_:) でトラッキング対象を変更することができます。selectSubjects(_:) の引数には、トラッキング対象にしたいDockAccessory.TrackedPerson 、DockAccessory.TrackedObject のidentify を配列で指定します。
コントロールボタン

DockKit対応アクセサリに搭載されている、ボタンやホイールの変更を検知することができます。例えば、Insta360 Flow & Proにはホイールとボタンが搭載されており、それらの変更を検知することができます。

ボタンやホイールの変更を検知
DockAccessory.AccessoryEvents
DockAccessory.AccessoryEvents はDockKit対応アクセサリ側で発生したイベントの非同期シーケンスです。非同期で、はDockKit対応アクセサリ側で発生したイベントを表すDockAccessory.AccessoryEvent オブジェクトを取得することができます。
DockAccessory.AccessoryEvent
DockAccessory.AccessoryEvent はDockKit対応アクセサリ側で発生したイベントを表すEnum です。以下の要素を持っています。
| 要素 | 意味 | 
|---|---|
| button(id: Int, pressed: Bool) | カスタムボタンで発生したアクセサリイベント | 
| cameraFlip | バックカメラとフロントカメラを切り替えるアクセサリイベント | 
| cameraShutter | シャッターを切るアクセサリイベント | 
| cameraZoom(factor: Double) | カメラズームを行うアクセサリイベント | 
DockAccessory.AccessoryEvents から非同期的に取得したDockAccessory.AccessoryEvent の要素をチェックし、発生したアクセサリイベントによって、実行する処理を分けることができます。
バッテリー状態の監視
DockAccessory.BatteryStates
DockAccessory.BatteryStates はiPhoneと接続中の、DockKit対応アクセサリのバッテリー状態の非同期シーケンスです。非同期でDockKit対応アクセサリ側のバッテリー状態を表すDockAccessory.BatteryState オブジェクトを取得することができます。
DockAccessory.BatteryState
DockAccessory.BatteryState はiPhoneと接続中の、DockKit対応アクセサリのバッテリー状態を表す構造体です。DockKit対応アクセサリのバッテリー状態に関するプロパティを持っています。
batteryLevel
現在のバッテリー充電率です。0..1 の範囲でバッテリー充電率を表します。
chargeState
バッテリーの充電状態を表すEnum です。
lowBattery
充電量が低いため、正常にDockKit対応アクセサリを動作させることが難しいかどうかを表します。
name
バッテリー名を表します。
おわりに
WWDC24で発表されたDockKitの新APIについて説明しました。2024/8/26時点のiOS 18 Developer Beta版では、若干動作に不安定な部分があると感じています。現時点では以下のような動作を確認しています。
- Auto-Tracking Stand Pro with DockKitはバッテリー状態を監視することはできるが、Insta360 Flow Pro & Flowはできない
- 
lookingAtCameraConfidence、speakingConfidenceの値が取得できない時がある
iOS 18がリリースされた後に、引き続き本記事をアップデートしていきます。
参考資料
・What’s new in DockKit




Discussion