tuqin
3 天以前 abfe3ffe5f6d161f2a6466c8bdbcbc17de1e64b6
fix(map): v2.0 补 HOST_TYPE;诊断页延长等待并修正协议

两处修正:

1) v2.0 必需 window.HOST_TYPE = '2'
官方 api?v=2.0 返回的内容是:
window.HOST_TYPE = "2";
window.BMap_loadScriptTime = ...;
document.write('<script src=".../getscript?v=2.0&ak=..."></script>');
即 HOST_TYPE 是由 api 那层设置的,直接加载 getscript 时必须自己补,
否则 SDK 初始化行为异常。
已在 utils.ts 与诊断页加载前补上,并把 BMAP_PROTOCOL 改为跟随页面协议。

2) 诊断页第 9 块的检查时机
客户带宽约 36KB/s,v2.0 SDK 221KB 需要 6 秒以上,
原来 5 秒就检查 DOM 和请求,必然看到「一直在加载」。
改为 15 秒,并在日志里提示「带宽慢的话要等 10 秒以上」。

说明:v2.0 的 getscript 通过 U(window,{BMap:B,...}) 暴露 window.BMap,
是完整可用 SDK;主瓦片为 qt=tile(普通 PNG 瓦片,实测直连 200 / 13382B 真实地图),
而 v3.0 用的 qt=vtile 矢量瓦片实测直连 403(当前 ak 未授权)。
已修改2个文件
9 ■■■■■ 文件已修改
public/bmap-test.html 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/map/src/utils.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/bmap-test.html
@@ -494,7 +494,10 @@
      (function () {
        var el = document.getElementById('log9');
        function lg(m, c) { var d = document.createElement('div'); d.className = c || ''; d.textContent = m; el.appendChild(d); }
        lg('加载 /bmap-sdk2d.js 并监听网络请求...');
        // v2.0 必需:api?v=2.0 会设置 window.HOST_TYPE='2',直接用 getscript 时要自己补上
        window.HOST_TYPE = '2';
        window.BMAP_PROTOCOL = window.location.protocol.replace(':', '');
        lg('加载 /bmap-sdk2d.js 并监听网络请求...(226KB,带宽慢的话要等 10 秒以上)');
        var s = document.createElement('script');
        s.src = '/bmap-sdk2d.js';
        s.addEventListener('load', function () {
@@ -527,7 +530,7 @@
            if (tile.length === 0) {
              lg('  ⚠ 没有任何瓦片请求发出 → SDK 内部瓦片 URL 可能仍指向被 IPv6 拦截的原始域名', 'bad');
            }
          }, 5000);
          }, 15000);
        });
        document.body.appendChild(s);
      })();
src/components/map/src/utils.ts
@@ -85,6 +85,8 @@
  // 百度官方要求:先声明协议,避免 HTTPS 页面下 SDK 拼出 http 子资源地址
  window.BMAP_PROTOCOL = window.location.protocol.replace(':', '');
  // v2.0 必需:官方 api?v=2.0 会设置 HOST_TYPE='2',直接用 getscript 时要自己补
  (window as any).HOST_TYPE = '2';
  window.BMapGL_loadScriptTime = Date.now();
  const query = `type=webgl&v=1.0&ak=${accessKey}&services=&t=${Date.now()}`;