本地用 http://192.168.1.8:8080 打开,navigator.serviceWorker.register 抛 SecurityError,提示只能安全来源,换 localhost 就正常。乍看像缓存或者权限的锅,追下去往往不是。
if (!window.isSecureContext) {
console.warn('SW 需要 HTTPS 或 localhost');
} else {
navigator.serviceWorker.register('/sw.js');
}
追下去是这么回事:Service Worker 只在 HTTPS 或 localhost 这类可信来源下可用,局域网 IP 走 http 不在白名单里。用自签证书又会卡在证书信任那一步。
「http 注册 SW 失败」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
权限不要一口气开到最大,先加到够用再往上试,范围小才好收。
具体做法是,本地调试统一用 localhost 或 127.0.0.1,别用局域网 IP;需要手机联调时起一个内网穿透的 HTTPS 地址,证书交给它管;在代码里先判断 isSecureContext,不支持时降级成普通页面。
验收就看一点,手机通过 HTTPS 隧道打开,注册成功且 Application 面板出现 activated 状态。
