我有以下代码,但我不知道为什么我的webview没有加载。
override func viewDidLoad() {
super.viewDidLoad()
loadWebview(env_url:"https://myurl.com")
}
func loadWebview(env_url : String){
let config = WKWebViewConfiguration()
let controller = WKUserContentController()
config.userContentController = controller
//only https is allowed
let url = URL(string: env_url)
if let optional_url = url {
let url_request = URLRequest(url: optional_url)
webview = WKWebView(frame: self.view.frame, configuration: config)
webview?.load(url_request)
webview?.allowsBackForwardNavigationGestures = true
webview?.navigationDelegate = self
webview?.uiDelegate = self
view.addSubview(webview!)
}
else{
showAlertDebug(message: "Invalid URL")
}
}
extension WebViewController : WKNavigationDelegate {
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping ((WKNavigationActionPolicy) -> Void)) {
decisionHandler(.allow)
}
func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
let cred = URLCredential(trust: challenge.protectionSpace.serverTrust!)
completionHandler(.useCredential, cred)
}
}
extension WebViewController : WKUIDelegate {
}
答案 0 :(得分:4)
您必须在Info.plist中提供ATS(App Transport Security)例外才能覆盖证书验证逻辑。当您接受证书时,ATS系统仍然拒绝它。有关详细信息,请参阅Information Property List Key Reference中的NSAppTransportSecurity
。通常,您希望特定域名NSAllowsArbitraryLoadsInWebContent
用于此用途。
请记住:
ATS的App Store评论
您使用某些App Transport Security(ATS)密钥会触发针对您的应用的其他App Store审核,并要求您提供理由。这些键是:
- NSAllowsArbitraryLoads
- NSAllowsArbitraryLoadsForMedia
- NSAllowsArbitraryLoadsInWebContent
- NSExceptionAllowsInsecureHTTPLoads
- NSExceptionMinimumTLSVersion
有资格考虑的理由的一些例子是:
- 必须连接到由不支持安全连接的其他实体管理的服务器
- 必须支持连接无法升级以使用安全连接且必须通过公共主机名访问的设备
- 必须提供来自各种来源的嵌入式Web内容,但不能使用NSAllowsArbitraryLoadsInWebContent键支持的类
- App加载已加密且不包含个性化信息的媒体内容
将应用程序提交到App Store时,请为App Store提供足够的信息,以确定默认情况下您的应用无法建立安全连接的原因。
作为一般规则,获取商业证书比管理管理自己的根证书的例外更容易(这是“自签名”证书的真实情况)。