关于RoomCaptureSession持久化、ARSession暂停异常及扫描组件复用的技术咨询
我们开发的应用支持房间扫描功能:用户扫描房间后可将结果保存到独立视图,后续还能继续扫描其他房间。现在我们想通过CapturedStructure实现房间合并,这就要求所有扫描都在同一个ARWorldMap中完成,而且不需要在同一个应用会话里重新定位——这应该符合Apple文档里提到的第一种场景。
目前我们找到的唯一能满足需求的方式,是把RoomCaptureView保存起来,每次需要重新启动扫描会话时复用这个视图,但这带来了一堆问题:
- 把View存在单例里完全不是理想的实现方式,我们调用的是
captureSession.stop(pauseARSession: false)来暂停会话。 - 如果复用同一个
RoomCaptureView,一旦扫描过程中出现错误,中间的引导提示(就是视图中央显示“Move device to start”的那段文字)就再也弹不出来了。就好像这些提示被彻底移除了一样,扫描直接卡在错误状态。
更麻烦的是,这些中央引导提示和RoomCaptureViewDelegate里通过didProvide instruction: RoomCaptureSession.Instruction返回的提示不是一回事,所以我们没法用代理方法来控制它们显示。我们发现有两个子视图和这个提示相关:RoomCaptureCoachingOverlayView和ARGlyphView,但它们都是非公开的API,我们没法强制让它们显示。我们还试了layoutIfNeeded()等各种方法试图让这些子视图出现,都没效果。
后来我们又试了另一个更理想的方案:保存ARSession实例,每次创建新的RoomCaptureView时传入这个已启动的会话:
let roomCaptureView = RoomCaptureView(frame: viewBounds, arSession: arSession)
这个方案能解决之前复用View带来的问题,但又遇到了新麻烦:即使使用同一个已经启动的ARSession,启动新的RoomCaptureView(也就是新的RoomCaptureSession)时,世界追踪会完全丢失,就好像captureSession.stop(pauseARSession: false)根本没按预期工作一样。
现在想请教大家:
- 有没有办法不用复用同一个
RoomCaptureView或RoomCaptureSession,就能在同一会话中进行后续扫描,而且不需要通过加载ARWorldMap重新定位? - 有没有办法强制让那些中央的引导提示重新显示?
备注:内容来源于stack exchange,提问作者moocow




