重新连接Azure会话后无法找到Azure Spatial Anchors问题咨询
问题分析与解决方案
首先明确:Azure Spatial Anchors(ASA)的服务端会话不会随应用停止自动删除,但客户端会话实例在应用关闭后会销毁。重新连接时如果没有复用**原有会话标识符(SessionId)**或正确恢复会话上下文,就会出现找不到锚点的情况。
核心问题排查点
- 会话ID复用错误:如果每次重启应用都创建新会话(生成新的SessionId),自然无法找到之前会话中创建/关联的锚点。必须在应用重启后,使用之前保存的SessionId重新连接到同一个服务端会话。
- 锚点未持久化到服务端:如果锚点仅保存在本地会话缓存(未调用
CloudSpatialAnchorSession.CreateAnchorAsync完成云端上传),应用重启后本地缓存清空,自然无法找到。 - 空间感知未完成:HoloLens重启应用后,空间映射需要重新构建,若在空间感知未就绪时发起锚点查询,设备无法匹配空间特征,导致查询无响应。
具体解决步骤
持久化并复用SessionId
在应用首次创建会话时,将SessionId保存到本地存储(比如Unity的PlayerPrefs),重启后读取该ID重新连接:// 首次创建会话后保存ID if (!PlayerPrefs.HasKey("ASA_SessionId")) { await session.StartAsync(); PlayerPrefs.SetString("ASA_SessionId", session.SessionId); PlayerPrefs.Save(); } // 重启后复用ID连接 else { string savedSessionId = PlayerPrefs.GetString("ASA_SessionId"); await session.StartAsync(savedSessionId); }确保锚点完成云端上传
创建锚点时,必须等待CreateAnchorAsync执行完成,确认锚点已同步到Azure服务:var cloudAnchor = new CloudSpatialAnchor(); cloudAnchor.LocalAnchor = localAnchorTransform.GetComponent<UnityEngine.XR.WSA.Anchor>(); await session.CreateAnchorAsync(cloudAnchor); // 确认锚点ID非空,说明上传成功 if (!string.IsNullOrEmpty(cloudAnchor.Identifier)) { // 可额外保存锚点ID用于后续查询 PlayerPrefs.SetString("Saved_AnchorId", cloudAnchor.Identifier); }等待空间感知就绪后查询锚点
重启应用后,监听SessionUpdated事件,等待空间数据收集足够后再发起查询:session.SessionUpdated += (object sender, SessionUpdatedEventArgs args) => { if (args.Status == SessionStatus.Ready) { // 此时发起锚点查询 StartCoroutine(FindSavedAnchor()); } }; IEnumerator FindSavedAnchor() { string anchorId = PlayerPrefs.GetString("Saved_AnchorId"); var locateAnchorTask = session.CreateWatcher(new AnchorLocateCriteria { Identifiers = new[] { anchorId } }); yield return new WaitUntil(() => locateAnchorTask.IsCompleted); }检查会话配置一致性
重新连接会话时,必须保证AccountId、AccountKey(或Azure AD令牌)等配置与首次创建会话时完全一致,否则会连接到错误的服务实例。
内容的提问来源于stack exchange,提问作者Dickson Hee
相关产品推荐
相关产品推荐

