ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Nearby Interactionについて
Nearby Interactionフレームワークは、U1チップを搭載しオプトインしたAppleデバイス間の距離と方向をストリーミングします。このハードウェアとソフトウェアの強力な組み合わせにより、2つ以上のデバイスの相対的な位置に基づく直感的な空間インタラクションをどう実現するかをご覧ください。ここでは、このセッションベースのAPIをご紹介し、常にプライバシーを意識しながら、まったく新しいインタラクティブな体験を届ける方法をお見せます。
リソース
関連ビデオ
WWDC22
WWDC21
WWDC20
-
ダウンロード
こんにちは WWDCへようこそ このセッションは “Nearby Interactionのご紹介”です 私はヤギルと言います Appleの位置情報チームのエンジニアです 本日はiOSの空間認識を基盤とする まったく新しいレベルのユーザ対話を 構築する方法についてお話しします 空間認識とは要するに 周囲の物理的世界を把握することです 手持ちのデバイスでそれが実現できれば 環境に応じた流れるような 操作が可能になります
これはiOS 13のAirDropです ここで表示しているものは iPhone 11で初めて利用可能になった 空間認識技術を利用しています ユーザは自分のデバイスを 他の人のデバイスに向け 共有シートに強いヒントを与えて 最も適切な共有の選択を表示させることができます
この種の高精度な対話は Appleが設計したU1チップのおかげで 初めて可能になりました
この機能をApp.でご活用 いただきたいと思います そのため本日はNearby Interaction フレームワークをご紹介します 強力かつ使いやすい iOSの空間認識インターフェースです ユーザ制御と透明性について お話しすることから始めましょう App.が他のユーザのデバイスとの間で Nearby Interactionセッションを開始します システムが最初にすることは 両方のユーザに 承認ダイアログを表示することです ユーザは近傍のデバイスとの 交信を許可しないことや 1回限りの許可を与えることもできます その場合App.を終了するまで 許可が有効になります 両方のユーザが許可を 選択すると 双方のデバイスで両者がどれだけ 離れているか そして どの方向にあるか把握し始めます
この種の豊かな空間情報によって App.内で より自然で直感的なユーザ体験を 作り出すことができます Nearby InteractionはU1チップ内蔵の iOS 14を実行するデバイスで利用できます
本日ご説明する内容です 最初にNearby Interactionを利用した iOSの空間認識についてご説明します それから相対位置の更新ストリーミングの 開始に必要なことについて ご説明します そして最後にApp.に採用できそうな ベストプラクティスについてお話しします では始めましょう
Nearby Interactionの App.に対する主な出力は2種類あります デバイス間の距離と 一方から他方への 相対的な方向です App.がNearby Interactionセッションを 実行していると 距離と方向の情報を含む連続した 更新のストリーミングを得ることができます このスライドで分かるように これらの更新は双方向性です セッションの両側のデバイスが 相互の相対的位置を同時に 把握することができます App.は単一のデバイスとの 交信のみに限定されません それぞれのデバイスは同時に 複数のセッションを実行できます 1セッションに対し相手側ピアは1つです この図では4つのデバイスが それぞれ相互に交信しています 各デバイスは3つのセッションを 並行して実行しています
これを実行するためのインターフェースに ついてご説明しましょう 最初にNearby Interactionセッション オブジェクトの作成から始めます Nearby Interactionはすべて セッションにカプセル化されています ARKitのような 他のAppleフレームワークと 同じパターンです セッションオブジェクトに対して 実行したい設定を送ります App.を実行している複数の ユーザがいて 空間的な意味で相互に対話 させたいとしましょう 実現するには両側のシステムに対してApp.が 近傍にある相手デバイスの特定方法を知らせます ピアの発見が重要な概念となります デバイスはお互いを プライバシー保護しながら発見できます そのために使われるのが 発見トークンです 発見トークンとは デバイスごとに 特定のNearby Interactionセッション内で ランダムに生成される識別子です
発見トークンは使用できる期間に 限定があります その期間はセッションそのものの 期間と全く同じです つまりセッションを無効化したり App.を終了したりすると あらゆるセッションと付随する トークンは無効化されます トークンはシステムが生成し App.はセッションオブジェクトを 通じてそれを受け取ります 作成された各セッション固有で一意の 発見トークンが付随します 最後にApp.は発見トークンを セッションオブジェクトからコピーして 対話したい相手ユーザと共有します それが何を意味するか 詳しく見ていきます
これらのデバイスの両方でApp.が 実行されていて App.にはデバイス間で相互に通信できる ネットワーク層があるとします ネットワーク層を使って デバイスから相手デバイスに 発見トークを送ります 一方のデバイスでも全く同じことを行います どうやって実行するのでしょうか? 発見トークンの種類は NSSecureCodingプロトコルに準拠しています つまり簡単にトークンをエンコードして 相手に送信できます App.が利用可能な どの送信技術でも使えます たとえばAppleの MultipeerConnectivityフレームワークも使えます あるいはApp.が対応していれば クラウド送信も可能
ブロックダイアグラムに戻ると App.が交換した発見トークンは セッション設定に入力されます そしてその設定は「実行」メソッドを 通じてセッションに提供されます
それではプログラムを見てみましょう
この短いプログラムで App.でセッションを動かすために 必要なことがすべてわかります まずセッションオブジェクトを作成 それにより 見えないところで 発見トークンを含む セッションを実行するために 必要なリソースをすべて割り当てます 次にシステムからのコールバックを 受け取れるように セッションのデリゲートを作成します
次の段階はセッション特有の 発見トークンの交換です これはApp.のネットワーク層を通じて 行う必要があります トークン交換段階が完了すると セッション設定作成に進みます 最後にその設定を使って セッションを実行します
プログラムに合わせて 構築を進めていきましょう セッションは更新を提供する先の デリゲートを取得します そして「実行」を呼び出すと デリゲートが近傍オブジェクトの 更新データを取得し始めます これがNearby Interactionセッションの 基本構造です
それではデモの時間です 距離および方向を利用する 小さなApp.を見てみましょう Monkey Timeです ここにApp.があり 向こうのテーブルにある iPhoneでも実行されています 既にセッションを開始しています 画面の表示を見てみましょう 一番上に測定された距離があり それが更新されているのが見えます そしてマスコットのサルが ここに表示されます サルは目を覆っています それではもう一つのiPhoneに 近づいてみて 何が起きるか見てみましょう
OK ここまで多くのことを 話したので 一度まとめます セッションを実行するには まず 各ピアでセッションオブジェクトを作成し そのピアでトークンを交換します 発見トークンが交換されると セッション設定が作成されます 更新ストリーミングを開始するには その設定でセッションを実行します セッションを中断することも可能 後から「実行」メソッドを 呼び出すことで再開することもできます 「実行」を呼び出すと セッションから更新データを 得られるとご説明しました そのことを前提にApp.内で 実装できるデリゲートの― コールバックについて より詳しく見ていきましょう
セッションデリゲートプロトコルです App.はdidUpdateコールバックを 実装することによって 近傍のデバイスの更新を受信できます 他にもいくつか 面白いメソッドがあります システムはApp.に対して 近傍オブジェクトとの対話が なくなると通知します この通知には関連する 理由が付いてきます 理由として予期されるものは2つあり 「timeout」と「peerEnded」です 2つはいくつか重要な点で異なります Timeoutはある期間においてセッション内で 活動がなかったということを意味します これはたとえば 2つのデバイスが 離れすぎた場合に起きます 一方で PeerEndedとは セッションが相手側で明示的に 無効化されたことを意味します ここで一つ注意です この通知はベストエフォートで 配信されます そのため必ず受け取れるとは限りません 以上が近傍オブジェクトが なくなる理由です 最後の3つのデリゲートコールバックは セッションのライフサイクルと関連があります セッション実行を妨げる 状況が発生すると デリゲートは中断通知を 受け取ります
たとえばセッションはApp.が 最前面でなくなった場合などに中断されます セッションを再開するためには 中断が終了したという― 通知を受け取る必要があります 中断が終了した コールバックを受け取った場合も セッションは自動的には 再開しません その時点でセッションを どうするか決定するためです セッションを再開したい場合 双方で「実行」を呼び出せます 最初にセッションを開始した時と 同様です しかし今回はトークンを交換する 必要はありません
最後に重要なものとして sessionDidInvalidateコールバックがあります これはApp.に対してセッションが 無効化されたことを通知します セッションは特定のエラー状態か リソース制限があると 対応するエラーコードと 共に無効化されます 無効化されたセッションは 再度実行できません 付随するトークンも もう使えません 対話再開には 新しいセッションを作成して 発見トークンを再交換します
以上がシステムから得る可能性がある さまざまなデリゲートコールバックです
全体図に戻ります 単一のセッションを図示しています App.は複数セッションを同時に 実行できるとお話ししました これが複数セッション時に どうなるかを示した図です 1ピアに対して1セッションを作成し 必要に応じApp.のその他の 部分を再利用できます たとえば私はすべてのセッションに 同じデリゲートを使用しました
「1ピアに対して1セッション」という 原則を維持することは 複数セッションの管理を 簡単にします 複数の近傍にある各デバイスに 各1つの対話セッションを 作成することで 同時に対話できます そのデバイスと会話するのと 同様とお考え下さい セッションは辞書のような データ構造での保存を推奨します ピアユーザに関するApp.の理解を Nearby Interactionセッションと 関連付けるためです これでいくつかのセッションを 構築して実行できました そして近傍オブジェクトについて 更新データが得られるようになりました ここで近傍オブジェクトに含まれる データの詳細について― さらにApp.でのそのデータの 利用方法も見ていきます
各近傍オブジェクトは 3つのプロパティで成ります まず 設定でセッションに 入力した発見トークンです このプロパティで 最初にトークンを受け取ったユーザに これらの更新データを ひも付けることができます 次のプロパティは距離です メーター単位の 距離測定結果を含み 2つのデバイスの距離を表します 最後のプロパティは方向です 自分のデバイスのローカル位置から見た 相手デバイスの相対位置を 三次元の単位ベクトルで 表示したものが含まれます
実際のプログラム表示です 近傍オブジェクト識別のための 発見トークン 自分と相手間の メートル単位の距離測定結果 App.相手への相対位置を 表すベクトルです 注意いただきたいのは距離と方向の プロパティはNULL値をとれるということです ベストプラクティスのための 素晴らしい前振りを覚えておいてください まず ハードウェアのサポート状況を 必ず確認しましょう 次にApp.の戦略的立ち位置を決定 Nearby Interactionがサポート されているかの確認結果に基づきます 必要に応じ 別のユーザ体験に フォールバックしましょう 次に方向性のある視野角の 概念を理解しましょう たとえばカメラのような 他のハードウェアセンサーと同様に Nearby Interactionに使用される ハードウェアには視野角の制限があります 視野角は概念的には このように円錐型です iPhoneの裏側から出ています ほぼiPhone 11の超広角カメラの 視野角とほぼ一致しています 対話相手のデバイスが 視野角の中にある場合― 高い信頼性を持った更新データは 距離と方向の両方で 作成されることが期待できます しかし片方のデバイスが方向性のある 視野角から外れている場合 App.は距離の更新のみで 方向は得られない可能性があります App.を開発でユーザ体験を設計する際には そこに留意してください 次にデバイスの物理的な向きの 影響を理解ください 最適な結果を得るには2つのデバイスが 縦向きである必要があります 1つのデバイスが縦で もう1つが横の場合 測定結果が限定される 可能性があります 絶対に避けなくてはならない 状況です そのような状況にならないよう App.で誘導しなくてはなりません 次に 閉塞に注意します 互いの見通しがはっきりしている 2つのデバイスは 最適の結果を得ることができます デバイス相互の見通しの 問題として考えることができます 壁や人など障害物が デバイス間にあると 測定の可用性が減少します お話ししたように 近傍オブジェクトの距離と方向の プロパティがNULL値になる可能性があります したがって これまで説明した理由で どちらも作成できない場合 フィールドがゼロになると予想されます これに備えアプリケーションでNULL値を 適切に処理してください 開発プロセスに関する すべてのベストプラクティスのために Xcode内でサポートされている ネイティブ統合シミュレーターを活用しましょう 実機で実行するのと同じ アプリケーションプログラムを 2つ以上のシミュレーターウインドウで実行し 距離と方向の更新を得られるようにできます 皆さんにこれをお届けできて 嬉しいです そしてこの機能で開発プロセスが簡単かつ 迅速になることを期待しています ベストプラクティスのための 最後の推奨事項として XcodeのNearby Interactionシミュレーションの ネイティブサポートを活用しましょう
本日はNearby Interactionをご紹介しました これでApp.が空間認識 できるようになります 新たなユーザ操作を実現します それはデバイス間の相対位置の 認識に基いています セッションへのご参加ありがとうございました この技術を利用して生み出されるApp.を 楽しみにしています
-
-
6:01 - Basic session setup
// A session instance. Store in whichever data structure makes the most sense for your app. var niSession: NISession? // Instantiate a new session object and set the session's delegate. func prepareMySession() { // Verify hardware support. guard NISession.isSupported else { print("Nearby Interaction is not available on this device.") return } // Create a new session for each peer. niSession = NISession() // Set the session’s delegate. niSession?.delegate = self // This class of 'self' needs to conform to NISessionDelegate. } // Share the encoded discovery token to the peer you intend to interact with. func sendDiscoveryTokenToMyPeer(myPeer: Any /* change to whichever type represents peers in your app */) { guard let myToken = niSession?.discoveryToken else { // The session object is not initialized or has been invalidated. return } if let encodedToken = try? NSKeyedArchiver.archivedData(withRootObject: myToken, requiringSecureCoding: true) { <# share token using your app's networking layer #> } } // Once you receive a token from the peer, create a configuration and run the session. // This functions shows how to decode token data that was previously encoded using NSKeyedArchiver. func runMySession(peerTokenData: Data) { guard let peerDiscoveryToken = try? NSKeyedUnarchiver.unarchivedObject(ofClass: NIDiscoveryToken.self, from: peerTokenData) else { print("Unexpectedly failed to decode discovery token.") return } // Create a session configuration using the discovery token received from the peer. let config = NINearbyPeerConfiguration(peerToken: peerDiscoveryToken) // Run the session with the configuration. niSession?.run(config) }
-
12:40 - Verify hardware support
// Always verify hardware support. guard NISession.isSupported else { print("Nearby Interaction is not available on this device.") return }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。