iOS Interface Builder添加的WKWebView如何启用limitsNavigationsToAppBoundDomains
WKWebView Interface Builder 拖拽实例配置 App Bound Domains 方案
核心问题说明
你当前的代码不会生效,核心原因是:通过Interface Editor(Storyboard/Xib)拖拽生成的WKWebView,其WKWebViewConfiguration属性为只读属性,你在viewDidLoad中新建的配置实例没有和已有的webView绑定,不会生效。
以下是两种可用解决方案:
方案1:改为代码创建WKWebView(线上版本首选,无兼容性风险)
直接删除Interface Editor中拖拽的WKWebView,改为代码初始化,创建时传入自定义配置即可。完整代码示例:
import UIKit import WebKit class ViewController: UIViewController { var webView: WKWebView! var subdomain:String = "" override func viewDidLoad() { super.viewDidLoad() // 初始化自定义配置 let configuration = WKWebViewConfiguration() configuration.limitsNavigationsToAppBoundDomains = true // 代码创建WKWebView并绑定配置 webView = WKWebView(frame: view.bounds, configuration: configuration) webView.autoresizingMask = [.flexibleWidth, .flexibleHeight] view.addSubview(webView) // 加载页面 guard let url = URL(string: "https://\(subdomain).domain.com") else { return } webView.load(URLRequest(url: url)) webView.allowsBackForwardNavigationGestures = false } }
该方案所有配置项都可自定义,无审核风险,是官方推荐的实现方式。
方案2:保留拖拽WebView,通过KVC注入配置(仅推荐测试使用)
如果你必须保留Interface Editor拖拽的WebView,可以通过KVC修改只读的configuration属性实现配置注入,代码如下:
import UIKit import WebKit class ViewController: UIViewController { @IBOutlet weak var webView: WKWebView! var subdomain:String = "" override func viewDidLoad() { super.viewDidLoad() // 自定义配置 let configuration = WKWebViewConfiguration() configuration.limitsNavigationsToAppBoundDomains = true // KVC注入配置到已有webView webView.setValue(configuration, forKey: "configuration") // 加载页面 guard let url = URL(string: "https://\(subdomain).domain.com") else { return } webView.load(URLRequest(url: url)) webView.allowsBackForwardNavigationGestures = false } }
注意:该方案修改了系统私有属性,存在App Store审核被拒的风险,不建议线上版本使用。
额外必填配置
仅设置limitsNavigationsToAppBoundDomains参数无法生效,你还需要在项目的Info.plist中添加对应域名配置:
- 新增
WKAppBoundDomains键,类型为数组 - 数组中添加你的业务域名,例如
*.domain.com,支持通配符格式
此外该特性仅支持iOS 14及以上系统版本,低于iOS 14的设备需要做降级兼容处理。
内容的提问来源于stack exchange,提问作者Mark Denn
相关产品推荐
相关产品推荐

