文档版本:v1.0 最后更新:2026-04-02 08:28:05
本项目在微信小程序中使用罗盘驱动:
heading-up 自动转图在一次围绕顶部提示窗、传感器显示链和性能优化的修改后,出现了以下问题:
heading-up 自动转图一起失效这次问题的主因不是算法本身,而是:
Android 微信环境下,罗盘监听需要被持续保活;之前将多处看似冗余的 compassController.start() 清理掉后,Android 的罗盘样本链被破坏了。
也就是说:
Compass Source 为 无数据罗盘 样本DeviceMotion 兜底,会出现:
Compass Source 恢复为 罗盘heading-up 恢复以下方向在本次排查中都被考虑过,但最终不是根因或不是主要根因:
DeviceMotion 兜底方案问题:
DeviceMotion 可以给出设备姿态角结论:
DeviceMotion 不能作为正式指北针来源。
曾排查:
AccelerometerGyroscopeDeviceMotionCompass结论:
曾尝试调整:
结论:
这些会影响“顺不顺”、“准不准”,但不能解释 Android 完全无罗盘样本。
将之前被清理掉的多处 this.compassController.start() 恢复回去。
这些调用点主要分布在:
commitViewport(...)handleTouchStart(...)animatePreviewToRest(...)normalizeTranslate(...)zoomAroundPoint(...)handleRecenter(...)handleRotateStep(...)handleRotationReset(...)这些调用在代码审美上看起来像“重复启动”,但在 Android 微信环境里,它们实际上承担了:
重新拉起 / 保活罗盘监听
的作用。
本项目当前应当采用以下原则:
Compass不要再让:
DeviceMotion参与正式指北针和自动转图的主方向链。
DeviceMotion 只保留为辅助或调试输入可用于:
但不要直接驱动指北针。
后续不要再把这些 compassController.start() 当成纯冗余逻辑随意清掉。
如果要优化代码,应该:
例如:
ensureCompassAlive()refreshCompassBinding()而不是直接删掉。
以下约束必须保持:
页面层必须保证任意时刻只有一个 MapEngine 活跃实例。
MapEngine.destroy() 中必须完整执行:
compassController.destroy()destroy()防止旧监听残留。
调试面板开关不应再控制:
否则容易再次引入平台差异问题。
以下字段建议长期保留,便于后续定位:
Compass SourcesensorHeadingTextheading-up 开关状态其中 Compass Source 至少应显示:
罗盘无数据避免再次将问题误判为算法问题。
如果后面要继续优化这段代码,推荐方向是:
compassController.start() 收口成命名明确的方法start() 调用DeviceMotion 正式兜底指北针在微信小程序里,Android 罗盘监听的稳定性比 iOS 更脆;某些看似冗余的 start() 调用,实际是平台兼容补丁,不应该在没有真机回归的情况下清理。