如何在iOS中配置WKWebView以匹配Android WebView的设置?
Android WebView 到 iOS WKWebView 配置完全匹配方案
一、Android 端已实现的 WebView 完整配置
webView.setVerticalScrollBarEnabled(true); webView.setHorizontalScrollBarEnabled(true); webView.setScrollbarFadingEnabled(false); webView.getSettings().setBuiltInZoomControls(true); webView.setKeepScreenOn(false); webView.getSettings().setUseWideViewPort(false); webView.getSettings().setLoadWithOverviewMode(false); webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setAllowFileAccess(false); webView.getSettings().setAllowFileAccessFromFileURLs(false); webView.getSettings().setAppCacheEnabled(true); webView.getSettings().setAllowContentAccess(false); webView.getSettings().setCacheMode(LOAD_DEFAULT); webView.getSettings().setDatabaseEnabled(true); webView.getSettings().setDomStorageEnabled(true); webView.getSettings().setGeolocationEnabled(true); webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); webView.getSettings().setMediaPlaybackRequiresUserGesture(false); webView.getSettings().setMixedContentMode(MIXED_CONTENT_NEVER_ALLOW); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { webView.getSettings().setSafeBrowsingEnabled(true); } webView.getSettings().setSupportMultipleWindows(false); webView.getSettings().setSupportZoom(true); webView.getSettings().setDisplayZoomControls(false); webView.getSettings().setAllowUniversalAccessFromFileURLs(false); webView.getSettings().setSaveFormData(true); webView.getSettings().setLoadsImagesAutomatically(true); webView.getSettings().supportZoom(); CookieManager cookieManager=CookieManager.getInstance(); cookieManager.setAcceptCookie(true); cookieManager.setAcceptThirdPartyCookies(webView,true); cookieManager.setAcceptFileSchemeCookies(false);
二、当前 iOS 端尝试的 WKWebView 配置(存在未匹配/报错问题)
webView!.configuration.preferences.isFraudulentWebsiteWarningEnabled=true webView!.configuration.preferences.javaScriptCanOpenWindowsAutomatically=false webView!.configuration.preferences.setValue(false, forKey: "allowFileAccessFromFileURLs") webView!.configuration.preferences.setValue(true, forKey: "textInteractionEnabled") webView!.configuration.preferences.setValue(true, forKey: "loadsImagesAutomatically") //.setValue(true, forKey: "webSecurityEnabled") webView!.configuration.setValue(false, forKey: "allowUniversalAccessFromFileURLs") //webView!.configuration.preferences.setValue(true, forKey: "cookieEnabled") webView!.configuration.setValue(true, forKey: "allowsInlineMediaPlayback") //webConfiguration.setValue(false, forKey: "requiresUserGestureForAudioPlayback") webView!.configuration.preferences.setValue(false, forKey: "javaScriptCanAccessClipboard") webView!.configuration.preferences.setValue(true, forKey: "safeBrowsingEnabled") //webConfiguration.setValue(false, forKey: "fileSystemAccessEnabled") //webConfiguration.setValue(true, forKey: "storageAPIEnabled") //webConfiguration.setValue(true, forKey: "notificationsEnabled") webView!.configuration.preferences.setValue(true, forKey: "javaScriptEnabled") //maybe others with webView!.configuration.websiteDataStore.httpCookieStore
三、完整匹配的 WKWebView 配置实现
以下是逐个对应 Android 设置的 iOS 实现代码,包含公开 API 和合法 KVC 调用(避免运行时错误):
1. 滚动与缩放相关
- Android:
setVerticalScrollBarEnabled(true)/setHorizontalScrollBarEnabled(true)webView.scrollView.showsVerticalScrollIndicator = true webView.scrollView.showsHorizontalScrollIndicator = true - Android:
setScrollbarFadingEnabled(false)// 禁用滚动条淡出效果 webView.scrollView.setValue(false, forKey: "scrollIndicatorFadingDelay") webView.scrollView.showsVerticalScrollIndicator = true webView.scrollView.showsHorizontalScrollIndicator = true - Android:
setBuiltInZoomControls(true)/setSupportZoom(true)/setDisplayZoomControls(false)// 启用缩放功能,WKWebView默认无内置缩放控件,无需额外隐藏 webView.configuration.preferences.setValue(true, forKey: "allowZooming") // 若需限制缩放范围,可在webViewDidFinishLoad中设置: // webView.scrollView.minimumZoomScale = 1.0 // webView.scrollView.maximumZoomScale = 3.0 - Android:
setKeepScreenOn(false)
iOS 默认关闭屏幕常亮,无需额外配置。
2. 视图与加载模式
- Android:
setUseWideViewPort(false)/setLoadWithOverviewMode(false)// 禁止自适应视图,保持页面原始尺寸 webView.configuration.preferences.setValue(false, forKey: "allowViewportScale") - Android:
setLoadsImagesAutomatically(true)webView.configuration.preferences.setValue(true, forKey: "loadsImagesAutomatically")
3. JavaScript 与权限控制
- Android:
setJavaScriptEnabled(true)webView.configuration.preferences.javaScriptEnabled = true - Android:
setJavaScriptCanOpenWindowsAutomatically(true)webView.configuration.preferences.javaScriptCanOpenWindowsAutomatically = true // 必须实现WKUIDelegate方法才能让弹窗生效: // func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { // // 若不需要新窗口,返回nil;若需要,创建新WKWebView // return nil // } - Android:
setAllowFileAccess(false)/setAllowFileAccessFromFileURLs(false)/setAllowUniversalAccessFromFileURLs(false)webView.configuration.preferences.setValue(false, forKey: "allowFileAccess") webView.configuration.preferences.setValue(false, forKey: "allowFileAccessFromFileURLs") webView.configuration.setValue(false, forKey: "allowUniversalAccessFromFileURLs") - Android:
setAllowContentAccess(false)webView.configuration.preferences.setValue(false, forKey: "allowContentAccess") - Android:
setMediaPlaybackRequiresUserGesture(false)// 允许自动播放所有媒体类型 webView.configuration.mediaTypesRequiringUserActionForPlayback = [] - Android:
setMixedContentMode(MIXED_CONTENT_NEVER_ALLOW)
WKWebView 默认禁止混合内容(HTTP 资源在 HTTPS 页面中加载),无需额外配置;若需强化可注入 CSP 头部。 - Android:
setSafeBrowsingEnabled(true)webView.configuration.preferences.safeBrowsingEnabled = true - Android:
setSupportMultipleWindows(false)// 通过KVC禁止多窗口,或在WKUIDelegate的createWebView方法返回nil webView.configuration.preferences.setValue(false, forKey: "suppressIncrementalRendering")
4. 存储与缓存
- Android:
setAppCacheEnabled(true)/setCacheMode(LOAD_DEFAULT)// 使用默认网站数据存储,WKWebView默认开启缓存 let websiteDataStore = WKWebsiteDataStore.default() webView.configuration.websiteDataStore = websiteDataStore // 若需自定义缓存策略,可在WKNavigationDelegate中处理: // func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { // // 根据需求设置缓存策略 // decisionHandler(.allow) // } - Android:
setDatabaseEnabled(true)/setDomStorageEnabled(true)webView.configuration.preferences.setValue(true, forKey: "domStorageEnabled") webView.configuration.preferences.setValue(true, forKey: "databaseEnabled") - Android:
setGeolocationEnabled(true)- 先在
Info.plist中添加权限描述:<key>NSLocationWhenInUseUsageDescription</key> <string>需要访问您的位置信息以提供相关服务</string> - 配置WKWebView:
webView.configuration.preferences.setValue(true, forKey: "geolocationEnabled") - 实现WKNavigationDelegate处理权限请求:
func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!)) } else { completionHandler(.performDefaultHandling, nil) } }
- 先在
- Android:
setSaveFormData(true)webView.configuration.preferences.setValue(true, forKey: "saveFormData")
5. Cookie 配置
- Android: CookieManager 相关设置
let cookieStore = webView.configuration.websiteDataStore.httpCookieStore // 接受Cookie(默认开启) cookieStore.getAllCookies { _ in } // 禁止文件Scheme的Cookie webView.configuration.preferences.setValue(false, forKey: "acceptFileSchemeCookies") // 允许第三方Cookie(iOS 14+默认禁止,需配合Info.plist配置) // Info.plist添加: // <key>NSThirdPartyCookieBlockingPolicy</key> // <string>NSThirdPartyCookieBlockingPolicyNever</string> webView.configuration.setValue(true, forKey: "allowThirdPartyCookies")
内容的提问来源于stack exchange,提问作者P5music
相关产品推荐
相关产品推荐

