What's new in Nearby Interaction
System & Services 进阶 20m

Nearby Interaction 的新功能

What's new in Nearby Interaction

2022年6月6日

在 Apple 官方观看视频

一句话判断

Nearby Interaction 框架今年最大的升级是与 ARKit 的深度整合,带来了类似 AirTag 精准查找的空间感知能力——如果你的应用涉及”找到附近的某个东西”,这场 Session 值得仔细看。

这场 Session 讲了什么

Apple Location Technologies 团队的 Jon Schoenberg 介绍了 Nearby Interaction 框架在 iOS 16 中的两大新功能:ARKit 增强模式和后台会话。

Nearby Interaction 基于 Apple 的 U1 超宽带芯片,提供设备间的精确距离和方向信息。2020 年首次发布时只支持两台 iPhone 之间的会话,2021 年扩展到 Apple Watch 和第三方 UWB 配件。今年最大的变化是引入了 ARKit 增强——利用 ARKit 计算的设备轨迹数据,大幅提升了超宽带的有效视场角和方向感知的稳定性。

Session 还介绍了后台会话功能,允许应用在后台持续追踪配件状态,以及第三方硬件支持的更新。

值得深挖的点

ARKit 增强模式的核心价值。 传统 Nearby Interaction 的超宽带视场角有限,方向信息并不总是可用。结合 ARKit 后,系统可以获取设备的运动轨迹,从而更稳定地推算目标方向。这套技术正是 AirTag 精准查找的底层方案。开启方式极其简单——只需在 NIConfiguration 上设置 isCameraAssistanceEnabled = true

新的方向属性。 开启 ARKit 辅助后,NINearbyObject 新增两个属性:horizontalAngle(水平方位角,弧度制)和 verticalDirectionEstimate(垂直方向估计)。前者提供精确的水平方向,后者告诉你目标在你上方、下方还是同一水平面。

ARSession 的共享机制。 ARKit 增强模式会在 Nearby Interaction 框架内部自动创建 ARSession,但如果你的应用本身已经使用了 ARKit,你需要通过 setARSession() 方法将现有的 ARSession 共享给 NISession。这避免了两个 ARSession 冲突的问题。共享时对 ARConfiguration 有严格要求:世界对齐必须设为 gravity、协作和面部追踪必须禁用、初始世界地图为 nil。

后台会话。 新增的后台会话允许应用在后台状态下继续接收配件的更新。这对于”查找我的钥匙”这类场景至关重要——用户不需要一直打开应用。

代码片段

// 开启 ARKit 弫助模式
let config = NINearbyAccessoryConfiguration(peer: discoveryToken)
config.isCameraAssistanceEnabled = true  // 一行代码开启 ARKit 增强

let session = NISession(configuration: config)
session.delegate = self

// 如果应用已有 ARKit 体验,需要共享 ARSession
// 在 SwiftUI 的 makeUIView 中:
let arView = ARView(frame: .zero)
niSession.setARSession(arView.session)  // 共享给 Nearby Interaction

// 处理更新回调,获取新的方向信息
func session(_ session: NISession, didUpdate nearbyObjects: [NINearbyObject]) {
    guard let object = nearbyObjects.first else { return }
    
    // 新增的水平角度(弧度)
    if let angle = object.horizontalAngle {
        // 更新箭头方向指引
    }
    
    // 新增的垂直方向估计
    if let vertical = object.verticalDirectionEstimate {
        // 目标在上方、下方还是同一水平面
    }
}

最佳实践

  • ARKit 增强模式最适合引导用户找到静止物品的场景,不适合追踪快速移动的目标
  • 共享 ARSession 时,确保 sessionShouldAttemptRelocalization 返回 false,否则 NISession 会被判定为无效配置而失效
  • didInvalidateWith 回调中检查新的 invalidARConfiguration 错误码,及时修复配置问题
  • horizontalAngleverticalDirectionEstimate 可能为 nil,始终做好可选值处理
  • 应用必须在 Info.plist 中提供相机使用说明字符串,向用户解释为什么需要相机权限
  • 对于已经使用 ARKit 的应用,确保只有一个 ARSession 在运行,通过 setARSession 共享

还有什么值得关注

  • 后台会话的具体 API 细节和生命周期管理需要进一步查阅文档
  • 第三方 UWB 配件的支持在今年有所扩展,具体硬件认证流程值得关注
  • 这套技术方案与 AirTag 精准查找使用相同底层技术,说明 Apple 正在将第一方功能的成熟技术逐步开放给开发者
  • 配套观看 WWDC 2020 的 “Meet Nearby Interaction” 和 WWDC 2021 的 “Explore Nearby Interaction with third-party accessories” 可以获得完整上下文
WWDC 2022