📲

Nearby Interaction GATTとバックグラウンドセッション

2023/12/04に公開

Nearby Interactionは、超広帯域無線(UWB) チップを搭載したデバイス同士でインタラクションを行うためのフレームワーク。

インタラクションを行う、と言われてもピンとこないかもしれないが、UWBを利用すると、互いに相手の距離と方向がわかる。で、その情報を使って相互になんかしましょうというのがNearby Interaction。

https://note.com/shu223/n/n7c3ca9279ec0

https://note.com/shu223/n/n40dc90a70d4d

このNearby Interactionが「バックグラウンドセッション」をサポートし、アプリがバックグラウンド状態でもアクセサリとインタラクション可能になったことがWWDC22の"What's new in Nearby Interaction"で解説されている。

https://developer.apple.com/videos/play/wwdc2022/10008/

同セッションによると、どうやら通信自体にはBLE / Core Bluetoothを利用し、Nearby Interaction GATTを通じてUWBの情報をやりとりする、というもののようだ。

Nearby Interaction GATTなるものがあるのか、ほうほう、ということで、これについて調べてみた。

バックグラウンドセッションの想定ユースケース

まず、Appleとしてはどういうユースケースを想定してこの機能を追加したのか。WWDCの同セッションでは以下のように述べられている。

However, when your app transitions to the background or when the user locks the screen on iOS and watchOS, any running NISessions are suspended until the application returns to the foreground.
(しかし、アプリがバックグラウンドに遷移したとき、またはiOSとwatchOSでユーザーが画面をロックしたとき、アプリケーションがフォアグラウンドに戻るまで、実行中のNISessionsは中断されます。)

This means you needed to focus on hands-on user experiences when interacting with your accessory.
(つまり、アクセサリーとインタラクションする際には、ハンズオンのユーザーエクスペリエンスにフォーカスする必要がありました。)

Starting in iOS 16, Nearby Interaction has gone hands-free.
(iOS 16から、Nearby Interactionはハンズフリー化されました。)

You're now able to use Nearby Interaction to start playing music when you walk into a room with a smart speaker, turn on your eBike when you get on it, or trigger other hands-free actions on an accessory.
(スマートスピーカーで部屋に入ると音楽再生を開始したり、eBikeに乗ると電源を入れたり、アクセサリーの他のハンズフリーアクションをトリガーするためにNearby Interactionを使用することができるようになりました。)

You can do this even when the user isn't actively using your app via accessory background sessions.
(これは、ユーザーがアクティブにアプリを使用していないときでも、アクセサリーのバックグラウンドセッションを介して行うことができます。)

なるほどなるほど、これって過去多くのスマホ連動デバイスでもやりたかったことであって、これがUWB / Nearby Interactionで補強されるわけか。

バックグラウンドセッションとBLE

WWDC22での同セッションでの解説によると、ざっくり以下のフローでBLEを用いたNearby Interactionのバックグラウンドセッションが行われる。

  • BLEを使用してアクセサリーとペアリングする

  • アクセサリに接続する

  • アクセサリはUWB設定データを生成し、アプリケーションに送信するとともにNearby Interaction GATT サービスにデータをセットする。

  • アプリがアクセサリの設定データを受信したら、アクセサリのUWB設定データとBluetoothピア識別子(ペリフェラルUUIDのことかと)を使用してNINearbyAccessoryConfigurationオブジェクトを作成する

  • Finally, when your application receives the accessory's configuration data, construct an NINearbyAccessoryConfiguration object using a new initializer providing both your accessory's UWB configuration data and its Bluetooth peer identifier. (訳しにくかったので原文ママ。この後に出てくるコード見た方が理解は早いはず)


WWDC22 "What's new in Nearby Interaction" より

Nearby Interactionサービス


WWDC22 "What's new in Nearby Interaction" より

以下WWDC22の同セッションでの説明の該当部分:

The Nearby Interaction service contains a single encrypted characteristic called Accessory Configuration Data.
(Nearby Interactionサービスは、Accessory Configuration Dataと呼ばれる単一の暗号化された特性を含んでいます。)

It contains the same UWB configuration data used to initialize the NINearbyAccessoryConfiguration object.
(これには、NINearbyAccessoryConfiguration オブジェクトの初期化に使用されたものと同じ UWB コンフィギュレーションデータが含まれます。)

iOS uses this characteristic to verify the association between your Bluetooth peer identifier and your NISession.
(iOS は、この特性を使用して、Bluetooth ピア識別子と NISession の間の関連付けを確認します。)

Your app cannot read from this characteristic directly.
(アプリがこの特性から直接読み取ることはできません。)

つまりNearby Interaction Serviceはこういうものらしい:

  • 同サービスが持っているキャラクタリスティックはAccessory Configuration Dataひとつだけ。

  • Accessory Configuration Dataキャラクタリスティックは暗号化されている。この値にはNINearbyAccessoryConfigurationの初期化時に使用したのと同じUWB コンフィギュレーションデータが含まれている。

  • iOS側ではこのキャラクタリスティックを使用して、Bluetoothピア識別子(ペリフェラルUUIDのこと)と NISession 間の関連付けを行う。

  • 「キャラクタリスティックの値を読み取れない」というのは、Data型としての値は取得できるが、その内容のフォーマットについては非公開、という意味だと思う。

アプリ側の実装

ペアリングをトリガーする

アクセサリをスキャンし、接続し、Nearby Interactionサービスとキャラクタリスティックを検出し、readを一度だけ行う。これにより、ユーザーにペアリングの許可を促すプロンプトが表示される。

func triggerPairing(peripheral : CBPeripheral, encryptedCharacteristic : CBCharacteristic) {
    peripheral.readValue (for: encryptedCharacteristic)
}

その他のCore Bluetooth実装

こちらはNearby Interactionならではのことは何もない。


WWDC22 "What's new in Nearby Interaction" より

Nearby Interactionセッションの開始

Accessory Configuration Dataキャラクタリスティックの値と、ペリフェラルUUIDからNINearbyAccessoryConfigurationを初期化し、NISessionをrunする。


WWDC22 "What's new in Nearby Interaction" より

Background Modesの設定

以下を有効にする:


WWDC22 "What's new in Nearby Interaction" より

Nearby Interaction GATTの仕様書

非公開領域にあるので内容についてはここには書かないが、以下にある。

https://developer.apple.com/nearby-interaction/specification/

iOSアドベントカレンダー

本記事はiOS Advent Calendar 2023の3日目の記事です。
https://qiita.com/advent-calendar/2023/ios

Discussion