はじめに
先日のWWDC2020で NearbyInteraction Framework
というものが発表されました。
これは複数端末間の距離や方角を計測するために利用できる Framework
だそうです。
今年はコロナの影響で、ソーシャルディスタンスという言葉が叫ばれるようになったこともあり、意識せざるを得ないような内容に感じられたため、
WWDC2020で行われた『Meet Nearby Interaction』セッション動画を元に勉強していきたいと思います。
NearbyInteraction Frameworkの機能を利用できる端末
iPhone11以降でU1チップを備えている端末に限られます。
現段階では、
- iPhone11
- iPhone11 Pro
- iPhone11 Pro Max
の3端末に限られています。
※シミュレータが対応しているため、上記実機が手元になくても試すことができます。
NearbyInteraction Frameworkで測定できるもの
まず、 NearbyInteraction Framework
で測定可能なものですが、
- 距離
- 方角
の2つになっています。
上記2つは NINearbyObject に格納された状態で取得します。
それぞれ
1 2 3 4 5 6 7 |
|
と定義されています。
NearbyInteraction Frameworkの利用方法
ここからは詳細について見ていきましょう。
discoveryTokenとは
端末間の距離や方角を計測するとなると、互いの端末を検知し、ペアリングする必要がありそうな気がします。
これを可能にするために、 NearbyInteraction Framework
では NISession
オブジェクトを生成し、
その NISession
が提供する discoveryToken
を利用する必要があります。
下記のように discoveryToken
が NISession
内に定義されています。
1 2 3 4 5 |
|
因みに、この discoveryToken
は
- ランダムな識別番号として生成される
session
と同等の有効期限が存在するsession
の無効にしたり、アプリを終了するとdiscoveryToken
も無効になる
という性質があります。
この discoveryToken
を端末間で共有し合うことで、距離や方角を計測する端末を認識することができるわけです。
discoveryTokenの共有方法
では、 discoveryToken
の端末間での共有方法は何があるかというと、
WWDC2020のセッションでは、 Multiple Connectivity Framework
が紹介されていました。
また、 discoveryToken
は NIDiscoveryToken
型であり、
1 2 3 |
|
のように NSSecureCoding
に準拠しているため、下記のように簡単にエンコードすることができます。
1 2 3 4 5 |
|
Multiple Connectivity Framework
を利用する場合は、下記のように送信します。
1 2 3 4 5 6 7 |
|
逆に他端末から送信されたエンコードされたデータを受信したら、
1 2 3 |
|
のようにデコードし、 discoveryToken
を取り出します。
これで互いに計測対象端末の discoveryToken
が共有できました。
計測値の取得方法
あとは、受信した discoveryToken
を元に生成した config
を利用してセッションを開始します。
1 2 |
|
対象端末との距離や方角の値は NISessionDelegate
を通じて取得します。
下記の didUpdate
メソッドにて、最新の NINearbyObject
情報が取得できます。
1 2 3 4 5 6 |
|
NISessionDelegate
には他にも幾つかメソッドが用意されています。
例えば、 didRemove
メソッドは、
1 2 3 4 5 6 7 |
|
ペアリングしたはずの計測対象端末から情報が取得できない場合に呼び出されます。
これが呼び出されるパターンは主に次の2つになります。
- 計測対象端末が遠く離れてしまい、情報取得可能な期間をタイムアウトした場合
- 計測対象端末がセッションを終了した場合
上記理由も、メソッド引数の reason
に格納されているため、識別することができます。
1 2 3 4 5 6 7 8 |
|
また、アプリの状態に関わるメソッドも用意されています。
1 2 3 4 5 6 7 8 9 10 |
|
sessionWasSuspended
はアプリがFG起動を終了し、サスペンド状態になった際に呼び出され、
sessionSuspensionEnded
はアプリが再びFG起動に戻し、サスペンド状態が終了した際に呼び出されます。
因みに、セッションは一度停止すると自動的に再開はされないため、 sessionSuspensionEnded
内で再度セッションを開始する必要があります。
1 2 3 4 5 |
|
最後の Delegate
メソッドとして didInvalidateWith
が用意されています。
これはセッションが無効になった場合に呼び出されます。
1 2 3 4 5 6 |
|
セッションが無効になると、 run
メソッドを使っても再開することができないため、
セッションの生成からやり直す必要があります。
(セッションを生成し、 discoveryToken
を交換し、セッションを開始する一連の流れを頭からやり直します。 )
NearbyInteraction Frameworkで計測する上での制約
NearbyInteraction Framework
は非常に強力な計測ができますが、
その精度を高めるためには幾つかユーザに制約を課さざるを得ないようです。
その制約とは、
- 方角の測定可能フィールド上に両端末が存在していること
- 両端末ともに
Portrait
の向きで端末を持っていること - 両端末間に壁や人などの障害物がないこと
が上げられています。
以下、セッションの資料がわかりやすかったため、引用させて頂きます。
方角の測定可能フィールド上に両端末が存在していること
両端末ともにPortraitの向きで端末を持っていること
両端末間に壁や人などの障害物がないこと
まとめ
さて、如何でしたでしょうか。
利用上の制約があることで万能ではないと感じる方もいるかもしれませんが、
cm単位の精度で端末間の距離や方角がわかるという機能は、
これからの新生活で大活躍する可能性も秘めているかもしれません。
個人的には、
何か世の中の役に立つようなサービスを考えるきっかけになったかなと思いました。
最後に、今回説明させて頂いた内容は、冒頭に書きました通りMeet Nearby Interaction動画で確認できますし、
Implementing Interactions Between Users in Close Proximitにてサンプルコードも公開されています。
より詳細を見る場合は当然ですが、上記を見ることをオススメいたします。
といったところで本日はここまで。