探索 ARKit 5
Explore ARKit 5
2021年6月10日
一句话判断
ARKit 5 的更新不算激进 —— 商业地标锚点、App Clip Code 识别和多人协作改进是三个主要话题,但对大多数 AR app 开发者来说,这些可能都不是你的痛点。
这场 Session 讲了什么
ARKit 5 带来了三个方向的更新。第一个是商业地标锚点(Location Anchors)的扩展,现在支持更多城市,定位精度也有所提升。开发者可以通过经纬度在真实世界的特定位置放置 AR 内容,这对于城市导览、零售导航类 app 很有用。
第二个是 App Clip Code 识别。ARKit 现在可以扫描和识别 App Clip Code,在 AR 场景中直接触发 App Clip 体验。这个功能和 NFC 标签类似,但结合了 AR 的视觉交互。
第三个是多人协作 AR(Collaborative Session)的改进。ARKit 从一开始就支持多人共享 AR 场景,但这次更新让协作数据的同步更稳定,地图合并(Map Merging)的速度更快。对于需要多人同时参与 AR 体验的场景(比如桌游、教育演示),体验会有明显提升。
值得深挖的点
Location Anchors 的城市覆盖范围。ARKit 5 的地标锚点从最初的几个城市扩展到了伦敦、纽约、旧金山、洛杉矶、芝加哥、迈阿密、香港等。它依赖苹果预先扫描的 LiDAR 地图数据,所以只有在覆盖城市内才能使用。GPS + 视觉定位的组合让锚点精度能达到米级,但室内场景表现不佳。
App Clip Code 的 AR 集成。App Clip Code 是苹果设计的专用二维码格式,NFC + 视觉双通道。ARKit 5 让你可以在 AR 体验中识别这些 Code 并自动跳转到对应的 App Clip。实现方式是在 ARSession 的配置中启用 ARAppClipCodeAnchor,系统会在检测到 Code 时自动创建锚点。
代码片段
设置 Location Anchor:
import ARKit
func addLocationAnchor(to sceneView: ARSCNView, coordinate: CLLocationCoordinate2D) {
let locationAnchor = ARGeoAnchor(
name: "store_anchor",
coordinate: coordinate,
altitude: 0 // 海拔设为 0 表示使用地面高度
)
let config = ARWorldTrackingConfiguration()
// 确保当前地区支持地理锚点
if ARGeoTrackingConfiguration.isSupported {
sceneView.session.add(anchor: locationAnchor)
}
}
检测 App Clip Code:
import ARKit
func configureAppClipCodeDetection(for session: ARSession) {
let config = ARWorldTrackingConfiguration()
// 启用 App Clip Code 检测
config.appClipCodeTrackingEnabled = true
session.run(config)
}
// 在 ARSessionDelegate 中处理检测结果
func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
for anchor in anchors {
if let appClipAnchor = anchor as? ARAppClipCodeAnchor {
// 获取 Code 中的 URL
let url = appClipAnchor.url
print("检测到 App Clip Code: \(url?.absoluteString ?? "")")
// 在锚点位置显示 AR 内容
showARContentAtAnchor(appClipAnchor, url: url)
}
}
}
多人协作 AR 数据共享:
import ARKit
import MultipeerConnectivity
func startCollaborativeSession() {
let config = ARWorldTrackingConfiguration()
config.isCollaborationEnabled = true
arView.session.run(config)
}
// ARSessionDelegate 中转发协作数据
func session(_ session: ARSession, didOutputCollaborationData data: ARSession.CollaborationData) {
// 通过 MultipeerConnectivity 发送给其他参与者
let encodedData = try! NSKeyedArchiver.archivedData(
withRootObject: data,
requiringSecureCoding: true
)
multicastDelegate.send(encodedData, toPeers: connectedPeers, with: .reliable)
}
最佳实践
- Location Anchor 仅适用于户外场景。如果要做室内导航 AR,还是得用 Image Anchor 或平面检测。不要在商场里依赖地理锚点。
- App Clip Code 的 AR 体验要做好容错。Code 可能被遮挡、光线不足或角度刁钻。检测到部分信息时给用户反馈,而不是默默无响应。
- 多人协作场景中,Host-Client 模式比 Peer-to-Peer 更稳定。让一个设备作为地图的权威来源,其他设备通过协作数据合并进来,减少地图冲突。
还有什么值得关注
- ARGeoTrackingConfiguration 现在可以在 Simultaneous VR/AR 模式下和 Face Tracking 共存(仅限 LiDAR 设备)。
- RealityKit 2 和 ARKit 5 的配合更紧密,直接在 RealityKit 中使用地理锚点更方便。
- 苹果提供了 App Clip Code 的生成工具,可以在开发者网站上创建和下载。