WWDC Quick Look 💓 By SwiftGGTeam
Meet Nearby Interaction

Meet Nearby Interaction

元の動画を見る

ハイライト

iOS 14導入NearbyInteractionこのフレームワークは、Apple U1 チップの超広帯域テクノロジを使用して、デバイス間の正確な位置決めを実現します。

主要内容

AirDrop はすでに iOS 13 で空間認識シーンを実証しています。ユーザーが自分の iPhone を別の人に向けると、共有パネルにより関連性の高い受信者が最上部に表示されます。このエクスペリエンスは iPhone 11 の Apple U1 チップに依存していましたが、当時、開発者は同じ機能をアプリに直接組み込むことができませんでした。

iOS 14 の Nearby Interaction はこれを可能にします。参加に同意した 2 つのデバイスはセッションを確立し、互いの距離と方向を継続的に受信できます。距離はメートル単位で、方向はホスト マシンを基準とした 3 次元の単位ベクトルです。アプリケーションはこれらの更新をインターフェイス、ゲーム ルール、またはマッチング プロセスに統合して、より現実空間に近いインタラクションを作成できます。

この機能により、最初のステップからプライバシーの境界がもたらされます。システムは両方のユーザーに許可を求めるプロンプトを表示します。認証は 1 回限りであり、アプリが終了するまで有効です。デバイスは、システムによって生成された検出トークンも交換します。トークンは現在のセッション内でのみ有効であり、セッションが期限切れになるかユーザーがアプリを終了すると無効になります。

開発者が対処しなければならない実際のタスクは 3 つあります。ピアごとに 1 つずつ構築することです。NISession、独自のネットワーク層を通じて検出トークンを交換してから、NINearbyPeerConfiguration測距と機首方位の更新を開始します。次に、一時停止、再開、無効化、ハードウェア サポート、視野、オクルージョン、デバイスの向きなどの現実的な制約に対処する必要があります。

詳細

Nearby Interaction セッションを作成する

(03:29) Nearby Interaction の基本単位はセッションです。各セッションはピアに対応します。アプリが最初に作成されますNISession、デリゲートを設定し、独自のネットワーク層を介してローカル検出トークンを相手に送信します。相手も同じことをしなければなりません。

(05:25) ディスカバリートークンフォローNSSecureCoding, だからあなたは使うことができますNSKeyedArchiverエンコードされ、MultipeerConnectivity、クラウド チャネル、またはアプリの既存のネットワーク層を通じて送信されます。相手のトークンを受け取った後、アプリはデコードしますNIDiscoveryToken、作成するNINearbyPeerConfiguration、最後に電話しますrun

// 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)
}

キーポイント:

  • NISession.isSupported入場チェックです。 U1 サポートが利用できない場合に代替エクスペリエンスを提供します。
  • NISession()リソースが現在のセッションに割り当てられ、対応する検出トークンが生成されます。
  • delegate近くのオブジェクトの更新やセッションのライフサイクル イベントなどのシステム コールバックを受信します。
  • 検出トークンは現在のセッションから取得され、このセッションの有効期間内でのみ使用できます。
  • NINearbyPeerConfiguration(peerToken:)相手のトークンを設定に入れます。
  • runセッションを開始すると、デリゲートは近くのオブジェクトからの更新の受信を開始します。

更新、削除、ライフサイクルの処理

(08:26) セッションの開始後、アプリはパスしますNISessionDelegate近くのオブジェクトの更新を受信します。didUpdateコールバックは近くのオブジェクトをもたらします。オブジェクトには、検出トークン、距離、方向という 3 つのプロパティがあります。検出トークンは、更新を社内のユーザーまたは同僚にマッピングするために使用されます。

(08:37) システムは、近くのオブジェクトと対話しなくなった場合にもアプリに通知します。その理由として考えられるのは、timeoutたとえば、デバイスが遠すぎて、一定期間アクティビティがなかった場合などです。それもあるかもしれないpeerEnded、相手側がセッションを明らかに無効にしたことを示します。スピーチリマインダー、peerEndedこれはベストエフォート型の通知であり、アプリは通知が届くことを想定できません。

(09:21) セッションのライフサイクルには、一時停止と有効期限も含まれます。アプリがバックグラウンドになると、セッションは一時停止されます。一時停止後、セッションは自動的に再開されません。対話を継続したい場合は、双方が再度呼び出しを行う必要があります。runただし、ディスカバリー・トークンを再交換する必要はありません。セッションが無効になると、セッションを再度実行することはできず、関連するトークンを再度使用することもできません。対話を再開するには、新しいセッションを作成し、トークンを再度交換する必要があります。

キーポイント:

  • didUpdateこれは、UI を駆動し、検出トークンを使用してピアと関連付けるメインのコールバックです。
  • timeoutこれは、一定期間セッション アクティビティがないことを意味します。一般的な理由は、デバイスが遠すぎることです。
  • peerEndedこれは、相手方が率先して終了したことを意味しますが、この通知が確実に届くとは限りません。
  • 一時停止終了後に再開できますrun、トークンを再交換する必要はありません。 ・無効は終了ステータスです。新しいセッションを作成してトークンを再交換することのみが可能です。

1 つのピアが 1 つのセッションに対応します

(10:38) Nearby Interaction は、アプリが 1 つのデバイスのみと対話するように制限しません。各デバイスは同時に複数のセッションを実行できますが、推奨される原則は明確です。つまり、ピアごとに 1 つのセッションです。

このモデルにより、マルチデバイス シナリオの管理が容易になります。アプリはデリゲートまたは他のネットワーク層コードを再利用できますが、セッション自体は辞書などのデータ構造に保存され、ビジネス内の対応するピア識別子にマップされる必要があります。NISession。ピアが切断、タイムアウト、または失敗した場合、アプリはそのセッションのみを処理できます。

キーポイント:

  • 複数人空間のインタラクションでは、単一の共有セッションではなく、複数のポイントツーポイント セッションが使用されます。
  • ディクショナリ マッピングでは、ピア ユーザー、検出トークン、およびNISession連絡してください。
  • デリゲートを再利用する場合、対応するピアもコールバックから見つける必要があります。
  • この構造は、マルチプレイヤー ゲーム、緊密なコラボレーション、およびマルチデバイス ペアリングに適しています。

近くの物体の距離と方向を理解する

(11:39)近くの各オブジェクトには 3 つのプロパティがあります。検出トークンはオブジェクトを識別します。 distance は 2 つのデバイス間のメートル距離を表します。方向は、ローカル マシンに対する他のデバイスの方向を表す 3 次元の単位ベクトルです。

(12:28) 距離と方向はどちらも null 可能です。 nil のフィールドは通常の測定結果であり、通常はハードウェアの視野、方向、オクルージョンなどの現実の条件から得られます。 UI では、「距離のみ」、「距離と方向の両方」、「未測定」の 3 つの状態を表現できる必要があります。

キーポイント:

  • 距離は、近い、遠い、距離のしきい値、およびプログレッシブ UI を直接サポートできます。
  • 方向は、矢印、指示プロンプト、および対面の対話に適しています。
  • 両方のフィールドが nil の場合、ビジネス ロジックは解凍を強制できません。
  • 検出トークンは、測定結果をユーザーの ID に結び付けるための鍵です。

まずハードウェアのサポートを確認してください

(12:40) Nearby Interaction は、iOS 14 を実行している U1 搭載デバイスに依存します。講演では、最初にアプリ内の重要な場所でハードウェア サポートを確認し、サポートされていない場合は別のエクスペリエンスにフォールバックすることが推奨されています。

// Always verify hardware support.
guard NISession.isSupported else {
  print("Nearby Interaction is not available on this device.")
  return
}

キーポイント:

  • NISession.isSupportedこれはフレームワーク レベルの機能の判断であり、デバイス モデルに基づいて推測するだけではありません。
  • 通常のマッチング コード、リストの選択、Web ベースの招待など、製品プロセス中にフォールバック エクスペリエンスを事前に設計する必要があります。
  • このチェックは、空間インタラクション機能を表示するかどうかを決定するために機能の入り口に配置するのにも適しています。

視野、方向、オクルージョンの劣化したエクスペリエンスをデザインする

(12:49) Nearby Interaction には指向性のある視野があります。プレゼンテーションでは、これを電話の背面から伸びる円錐形として説明しており、iPhone 11 の超広角カメラの視野にほぼ対応しています。相手のデバイスがこの視野内にある場合、距離と方向が高い信頼度で生成される可能性が高くなります。視野外にある場合、アプリは距離のみを取得し、方向は取得できない場合があります。

(13:36) デバイスの向きも測定に影響します。最適な状況は、双方が縦向きで持つことです。縦画面と横画面が 1 つずつあると、測定の操作性が低下します。この講演では、オクルージョンへの注意も呼びかけています。デバイス間の見通し線が明確であることが最も効果的ですが、壁、人、その他の物体が邪魔になると、測定の有用性が低下します。

(14:35) 開発プロセスでは、Xcode のシミュレータ サポートを利用できます。同じアプリ コード セットで 2 つ以上のシミュレーター ウィンドウ間の距離と方向の更新をトリガーできるため、複数の物理デバイスを使用せずに基本プロセスをデバッグできます。

キーポイント:

  • 方向機能は視野の影響を受けるため、方向は常に利用可能な入力とは見なされません。
  • UI は、ユーザーがデバイスを縦方向に持つようにガイドする必要があります。
  • オクルージョンはユーザビリティを低下させるため、ユーザーにリダイレクトまたはアプローチするための明確なプロンプトを提供することをお勧めします。
  • シミュレータは、検証に適したセッション、トークン、デリゲート、および UI ステート マシンをサポートします。

重要ポイント

  • 近距離にいる人を見つけるためのインターフェイスを作成: イベント、教室、またはオフィスのシーンで、ペアになった 2 台のデバイスが距離と方向を介して互いに近づくようにします。この機能は、Nearby Interaction の継続的な相対位置更新によって実現されます。実装する際は、まずディスカバリートークンを交換してから、didUpdateの距離と方向は、距離リテラルと方向矢印にマップされます。

  • 対面でロックが解除される協力的な入り口を作成します: 共有ホワイトボード、2 人用ゲーム、またはパートナー タスクを開く前に、2 人が十分近くに立って方向を揃える必要があります。セッションは距離と方向を提供し、アプリは独自のしきい値を定義できます。初めに使用するNISession.isSupportedデバイスをフィルタリングし、各ピアのセッションを確立します。

  • マルチデバイスの宇宙ゲームを作成: 各プレイヤーの携帯電話と他のプレイヤーはセッションを個別に実行し、アプリは辞書を使用してピアを保存します。NISessionマッピングの。これにより、他の接続に影響を与えることなく、プレーヤーのタイムアウト、peerEnded、または無効化を個別に処理できます。

  • プライバシーに配慮したデバイス ペアリング プロセスを作成します: ユーザーが明示的に同意するアクションの後に検出トークン交換を配置し、アプリが終了するかセッションが期限切れになるときに状態をクリーンアップします。この設計は、音声での 1 回限りの許可とトークンのライフ サイクルに適合し、アクセサリの構成、一時的なコラボレーション、オンサイト チェックインに適しています。

  • ダウングレード プロンプトを含むスペース UI を作成します: 距離のみを受信した場合は距離バーを表示し、方向も使用できる場合は矢印を表示します。フィールドが nil の場合は、垂直画面に切り替えるか、カバーを外すか、位置を再調整するかをユーザーに促します。この関数は、ヌル可能な距離/方向、視野、向き、およびオクルージョンに関する音声の記述に直接対応します。

関連セッション

コメント

GitHub Issues · utterances