iOS/OSX Safari 11.3中navigator无service worker对象问题求助
嘿,我来帮你梳理下可能的原因和解决办法!Safari 11.3确实已经支持Service Worker,但它有几个严格的限制,很可能是这些限制导致你看不到navigator.serviceWorker:
必须使用HTTPS环境(localhost除外)
Safari对Service Worker的安全要求很高,只有在HTTPS协议下(本地开发的localhost是例外)才会暴露navigator.serviceWorker对象。如果你是在内网IP、自定义域名或者非HTTPS的环境下运行应用,浏览器会直接隐藏这个对象。确保你的测试环境是HTTPS,或者用localhost进行本地开发测试。关闭“阻止跨网站跟踪”隐私设置
Safari的这个隐私选项会直接禁用Service Worker(因为SW可能被用于跟踪用户行为)。你可以打开Safari的设置:- 进入Safari偏好设置
- 切换到「隐私」标签
- 取消勾选「阻止跨网站跟踪」
重启Safari后再试试,这个是很多人忽略的关键节点!
确认是生产环境构建
Create React App默认只在生产环境下注册Service Worker。如果你是用npm start运行的开发环境,CRA的默认逻辑不会触发SW注册,甚至可能不会加载相关代码。你可以先执行npm run build构建生产包,然后用静态服务器(比如serve -s build)运行来测试SW功能。避免在iframe中运行应用
Safari 11.3对iframe中的Service Worker支持有兼容性问题,如果你是在iframe里加载应用,可能会导致navigator.serviceWorker无法被访问。尽量直接在主窗口打开应用测试。不要使用file://协议
Service Worker完全不支持file://协议,如果你是直接打开本地HTML文件(比如双击index.html),肯定看不到navigator.serviceWorker,必须用HTTP/HTTPS服务器来运行。
如果以上方法都试过还是不行,可以打开Safari的开发者工具,在控制台查看有没有相关的报错信息,这能帮你进一步定位问题。
内容的提问来源于stack exchange,提问作者Dockson

