页面上了 https,站内还有一个 http 的统计接口,安卓 WebView 里请求直接被拦,控制台报 Mixed Content: The page at was loaded over HTTPS,iOS 上却悄悄放行。乍看像缓存或者权限的锅,追下去往往不是。

if (Build.VERSION.SDK_INT >= 21) {
  webView.getSettings().setMixedContentMode(
    WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
}

追下去是这么回事:安全上下文下浏览器禁止加载 http 子资源,WebView 默认按 block 处理。iOS 对部分请求降级放行,所以两端表现不一致。

碰到「Mixed Content 拦截」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。

同一份配置存在多处的,先确认改的是被加载的那一份。

具体做法是,把接口全部换成 https 并确认证书链完整;确实要临时放行就设 mixedContentMode 为 compatibility;只对白名单域名放行 不要全局打开;两端各抓一次包 确认请求真的发出。

验收就看一点,https 页面里的接口请求正常返回 200,控制台不再出现 Mixed Content 拦截。

作者 9823189