WKWebView禁用JavaScript:偏好设置不生效问题求助
搞定WKWebView无法保存禁用JavaScript偏好的问题
嘿,我来帮你解决这个头疼的问题!你的代码其实只是临时修改了当前会话的JS设置,但没把这个选择持久化存起来,而且直接替换WKPreferences对象的方式也不够稳妥,所以下次启动应用又回到默认状态了。下面给你分步的修复方案:
1. 先把用户的选择存到本地
首先得把用户要不要禁用JS的选择存在本地,用UserDefaults就很方便,点击按钮的时候做这件事:
// 点击禁用JS按钮时,把状态存起来 UserDefaults.standard.set(false, forKey: "isJavaScriptEnabled")
2. 正确修改WebView的JS设置
别直接新建WKPreferences对象替换,直接改现有配置里的属性更靠谱,要是想让当前页面立即生效,就加上重载:
// 直接修改现有配置的JS开关 webView.configuration.preferences.javaScriptEnabled = false // 重载页面让设置生效 webView.reload() // 别忘了同步存到本地 UserDefaults.standard.set(false, forKey: "isJavaScriptEnabled")
3. 应用启动时加载保存的偏好
这一步很关键!下次打开应用或者初始化WebView的时候,要把之前存的设置读出来,配置到WebView里:
// 读取本地保存的设置,默认是启用JS(和系统默认一致) let isJSAllowed = UserDefaults.standard.bool(forKey: "isJavaScriptEnabled") // 第一次打开应用时,还没存过设置,就用默认值true let defaultJSState = UserDefaults.standard.object(forKey: "isJavaScriptEnabled") == nil ? true : isJSAllowed // 初始化WebView配置的时候用上这个状态 let webConfig = WKWebViewConfiguration() webConfig.preferences.javaScriptEnabled = defaultJSState // 创建WebView let webView = WKWebView(frame: .zero, configuration: webConfig)
为啥你的原代码没效果?
- 你新建了
WKPreferences对象赋值给webView.configuration.preferences,虽然理论上可行,但有时候WebView不会立刻应用这个新对象的设置;更重要的是没把设置存本地,下次重启应用,WebView又用回默认配置了(默认JS是开着的)。 - 直接修改现有
configuration.preferences的属性,比替换整个对象稳定多了,WKWebView能更好地处理这种实时修改。
如果想让设置下次页面加载才生效(不是立刻),可以这么搞:
- 点击按钮时只存状态到
UserDefaults,不立刻改当前WebView的设置 - 下次加载页面(比如用户打开新页面、重启应用打开WebView)时,再读取状态应用到WebView里
比如按钮点击事件:
@IBAction func toggleJSButtonTapped(_ sender: UIButton) { // 切换状态:当前是开就改成关,反之亦然 let currentState = UserDefaults.standard.bool(forKey: "isJavaScriptEnabled") let newState = !currentState UserDefaults.standard.set(newState, forKey: "isJavaScriptEnabled") // 给用户弹个提示,说下次加载才生效 let alert = UIAlertController(title: "提示", message: "JavaScript设置会在下次页面加载时生效哦", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "好的", style: .default)) present(alert, animated: true) }
然后在WebView准备加载新页面的代理方法里应用设置:
func webView(_ webView: WKWebView, shouldStartLoadWith navigationAction: WKNavigationAction, navigationType: WKNavigationType) -> Bool { let isJSAllowed = UserDefaults.standard.bool(forKey: "isJavaScriptEnabled") webView.configuration.preferences.javaScriptEnabled = isJSAllowed return true }
这样就能保证下次页面加载时,JS状态是用户选的那个啦~
内容的提问来源于stack exchange,提问作者Bob Dickenson
相关产品推荐
相关产品推荐

