Highlight
iOS 14 引入了
NearbyInteraction框架,利用 Apple U1 芯片的超宽带(Ultra Wideband)技术实现设备间的精确定位。
核心内容
AirDrop 在 iOS 13 里已经展示过一个空间感知场景。用户把 iPhone 指向另一个人,分享面板就能把更相关的接收者放到顶部。这个体验依赖 iPhone 11 中的 Apple U1 芯片,但当时开发者还不能把同类能力直接放进自己的 App。
iOS 14 的 Nearby Interaction 把这件事开放出来。两台都同意参与的设备可以建立一个 session,持续收到彼此的距离和方向。距离以米为单位,方向是相对于本机的三维单位向量。应用可以把这些更新接到界面、游戏规则或配对流程里,做出更贴近真实空间的交互。
这个能力从第一步就带着隐私边界。系统会向双方用户显示权限提示;授权是一次性的,持续到 App 退出。设备之间还要交换由系统生成的 discovery token。token 只在当前 session 中有效,session 失效或用户退出 App 后也会失效。
开发者真正要处理的工作有三块:每个 peer 建一个 NISession,通过自己的网络层交换 discovery token,再用 NINearbyPeerConfiguration 启动测距和方向更新。之后还要处理暂停、恢复、失效、硬件支持、视场角、遮挡和设备朝向这些现实约束。
详细内容
建立一个 Nearby Interaction session
(03:29)Nearby Interaction 的基本单位是 session。每个 session 对应一个 peer。App 先创建 NISession,设置 delegate,然后把本机的 discovery token 通过自己的网络层发给对方。对方也要做同样的事。
(05:25)discovery token 遵循 NSSecureCoding,所以可以用 NSKeyedArchiver 编码,再通过 MultipeerConnectivity、云端通道或 App 已有的网络层传输。收到对方 token 后,App 解码出 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()会为当前 session 分配资源,并生成对应的 discovery token。delegate接收系统回调,包含 nearby object 更新和 session 生命周期事件。- discovery token 来自当前 session,只能在这个 session 有效期内使用。
NINearbyPeerConfiguration(peerToken:)把对方 token 放进配置。run启动 session,之后 delegate 开始收到附近对象更新。
处理更新、移除和生命周期
(08:26)启动 session 后,App 通过 NISessionDelegate 接收 nearby object 更新。didUpdate 回调会带来附近对象;对象上有 discovery token、distance 和 direction 三个属性。discovery token 用来把更新映射回业务里的用户或 peer。
(08:37)系统也会通知 App 何时不再和某个 nearby object 交互。原因可能是 timeout,例如设备距离过远导致一段时间没有活动;也可能是 peerEnded,表示另一端明确 invalidated 了 session。演讲提醒,peerEnded 是 best-effort 通知,App 不能假设它一定到达。
(09:21)session 生命周期还有暂停和失效。App 进入后台时 session 会被 suspended。暂停结束后,session 不会自动恢复;如果要继续交互,需要双方重新调用 run,但不需要重新交换 discovery token。session invalidated 后不能再次运行,相关 token 也不能再用;要恢复交互,必须创建新 session 并重新交换 token。
关键点:
didUpdate是驱动 UI 的主要回调,使用 discovery token 关联 peer。timeout说明一段时间内没有 session 活动,常见原因是设备太远。peerEnded表示对方主动结束,但这个通知不保证送达。- suspended 结束后可以重新
run,无需重新交换 token。 - invalidated 是终止状态,只能新建 session 并重新交换 token。
一个 peer 对应一个 session
(10:38)Nearby Interaction 不限制 App 只和一台设备交互。每台设备可以同时运行多个 session,但推荐原则很明确:一个 peer 一个 session。
这个模型让多设备场景更容易管理。App 可以复用 delegate 或其他网络层代码,但要把 session 本身存进字典一类的数据结构里,用业务中的 peer 标识映射到对应的 NISession。当某个 peer 断开、超时或失效时,App 能只处理那一个 session。
关键点:
- 多人空间互动采用多个点对点 session,而非单个共享 session。
- 字典映射能把 peer 用户、discovery token 和
NISession联系起来。 - 复用 delegate 时,也要能从回调里找到对应 peer。
- 这个结构适合多人游戏、近距离协作和多设备配对。
理解 nearby object 的距离和方向
(11:39)每个 nearby object 有三个属性。discovery token 标识对象;distance 表示两台设备之间的米制距离;direction 是一个三维单位向量,表示对方相对于本机的方向。
(12:28)distance 和 direction 都是 nullable。字段为 nil 属于正常测量结果,通常来自硬件视场、朝向、遮挡等现实条件。UI 要能表达「只有距离」「距离和方向都有」「暂时没有测量」三种状态。
关键点:
- distance 可以直接支持靠近、远离、距离阈值和渐进式 UI。
- direction 适合做箭头、指向提示和面对面互动。
- 两个字段都可能为 nil,业务逻辑不能强制解包。
- discovery token 是把测量结果接回用户身份的关键。
先检查硬件支持
(12:40)Nearby Interaction 依赖 U1-equipped devices running iOS 14。演讲建议在 App 的策略性位置先检查硬件支持,并在不支持时回退到另一种体验。
// Always verify hardware support.
guard NISession.isSupported else {
print("Nearby Interaction is not available on this device.")
return
}
关键点:
NISession.isSupported是框架级能力判断,不要只按设备型号猜测。- 回退体验要在产品流程里提前设计,例如普通配对码、列表选择或基于网络的邀请。
- 这个检查也适合放在功能入口处,用来决定是否展示空间互动能力。
设计视场、朝向和遮挡的降级体验
(12:49)Nearby Interaction 有方向视场。演讲把它描述成从手机背面延伸出去的一个 cone,大致对应 iPhone 11 的 Ultra Wide camera 视场。当对方设备位于这个视场内时,distance 和 direction 更可能以高信心产生;在视场外时,App 可能只拿到 distance,拿不到 direction。
(13:36)设备朝向也会影响测量。最佳状态是双方都以 portrait orientation 持握。一个竖屏、一个横屏会导致测量可用性下降。演讲还要求注意遮挡:设备之间清晰视线效果最好,墙、人或其他物体挡在中间时,测量可用性会降低。
(14:35)开发过程可以利用 Xcode 的 Simulator 支持。同一套 App 代码能在两个或更多 Simulator 窗口之间触发 distance 和 direction 更新,这让没有多台实体设备时也能调试基本流程。
关键点:
- 方向能力受视场影响,不能把 direction 当成始终可用的输入。
- UI 要引导用户用 portrait orientation 持握设备。
- 遮挡会降低可用性,最好给用户明确的重新指向或靠近提示。
- Simulator 支持适合验证 session、token、delegate 和 UI 状态机。
核心启发
-
做一个近距离找人界面:在活动、课堂或办公室场景中,让两台已配对设备通过 distance 和 direction 互相靠近。这个能力来自 Nearby Interaction 的连续相对位置更新。实现时先交换 discovery token,再把
didUpdate中的 distance 和 direction 映射成距离文字和方向箭头。 -
做一个面对面解锁的协作入口:两个人需要站到足够近、方向对齐后,才打开共享白板、双人游戏或结伴任务。session 提供距离和方向,App 可以定义自己的阈值。开始时用
NISession.isSupported过滤设备,再为每个 peer 建立一个 session。 -
做一个多设备空间游戏:每个玩家的手机与其他玩家分别运行 session,App 用字典保存 peer 到
NISession的映射。这样能独立处理某个玩家的 timeout、peerEnded 或 invalidated,不会影响其他连接。 -
做一个隐私友好的设备配对流程:把 discovery token 交换放在用户明确同意的动作之后,并在 App 退出或 session 失效时清理状态。这个设计贴合演讲里的 one-time permission 和 token 生命周期,适合配件配置、临时协作和现场签到。
-
做一个有降级提示的空间 UI:当只收到 distance 时显示距离条,当 direction 也可用时再显示箭头;当字段为 nil 时提示用户转为竖屏、移开遮挡或重新对准。这个功能直接对应演讲对 nullable distance/direction、视场、朝向和遮挡的说明。
关联 Session
- Design for location privacy — 从界面设计角度解释位置相关体验如何表达用户控制和透明度。
- What’s new in location — 了解 iOS 14 位置隐私控制和依赖位置数据的 App 如何设计回退路径。
- Build location-aware enterprise apps — 查看 Core Location 与 iBeacon 在近距离、场所感知企业体验中的实践。
- Build trust through better privacy — 补充 iOS 14 对敏感数据访问、透明度和权限提示的整体隐私原则。
评论
GitHub Issues · utterances