Swift 4中WKWebView带参数URL无法加载问题求助
我最近也碰到过类似的棘手问题——WKWebView加载带video id参数的页面时,直接显示空白页,连半点错误提示都不给!但加载像https://www.apple.com这类普通URL却完全正常。先把你提供的代码贴出来:
import UIKit import WebKit class VideoPlayerVC: UIViewController, WKUIDelegate { @IBOutlet weak var webview2: WKWebView! var videoId: String? override func viewDidLoad() { //test video id, this prints the booty workouts id on youtube!This target also opens on youtube the id on the end of this url: https://www.youtube.c... } }
结合我的排查经验,给你几个实用的解决方向,挨个试一遍应该能找到问题:
先确认URL拼接是否合法
大概率是你拼接的带video id的URL有问题!比如如果是YouTube链接,正确格式应该是https://www.youtube.com/watch?v=你的videoId。你得确保videoId没有空格、特殊字符没转义,最好在代码里打印最终URL看看:override func viewDidLoad() { super.viewDidLoad() guard let videoId = videoId else { print("videoId为空!") return } // 转义特殊字符,避免URL格式错误 guard let encodedVideoId = videoId.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed), let targetUrl = URL(string: "https://www.youtube.com/watch?v=\(encodedVideoId)") else { print("URL拼接失败") return } print("最终加载的URL: \(targetUrl)") webview2.load(URLRequest(url: targetUrl)) }要是打印出来的URL格式不对,那肯定加载不出来。
添加WKNavigationDelegate抓加载错误
你现在只设置了WKUIDelegate,根本拿不到加载过程中的错误信息!赶紧补上导航代理,这样哪怕页面空白,也能知道到底是哪里出问题了:class VideoPlayerVC: UIViewController, WKUIDelegate, WKNavigationDelegate { @IBOutlet weak var webview2: WKWebView! var videoId: String? override func viewDidLoad() { super.viewDidLoad() webview2.navigationDelegate = self // 必须设置代理! // 上面的URL拼接代码... } // 监听加载失败事件 func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { print("页面加载失败: \(error.localizedDescription)") } // 监听页面加载完成 func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { print("页面加载完成") } // 监听子资源加载失败(比如页面里的图片、脚本加载失败) func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { print("资源加载失败: \(error.localizedDescription)") } }有了这些代理方法,空白页的原因就能一目了然——是网络问题、URL无效,还是页面本身的脚本错误?
检查ATS配置是否限制了加载
如果目标网站的HTTPS证书有问题,或者你不小心用了HTTP链接,iOS的App Transport Security(ATS)会直接阻止页面加载。你可以在Info.plist里临时添加ATS例外来测试:- 右键
Info.plist-> Add Row - 添加
NSAppTransportSecurity(类型是Dictionary) - 在它下面添加
NSAllowsArbitraryLoads(类型是Boolean),设置为YES
注意:上线前一定要把这个改成针对特定域名的例外,不然App Store会拒审!
- 右键
确认WKWebView的配置满足视频页面需求
很多视频网站需要JavaScript支持,或者允许自动播放权限。你可以调整WKWebView的配置:override func viewDidLoad() { super.viewDidLoad() // 配置webview权限 let webConfig = webview2.configuration webConfig.preferences.javaScriptEnabled = true // 开启JS // iOS 10+允许视频自动播放(根据需求调整) webConfig.mediaTypesRequiringUserActionForPlayback = [] webview2.navigationDelegate = self // 加载URL的代码... }用Safari测试URL是否有效
把你拼接好的URL复制到Safari里打开,如果Safari也打不开,那就是URL本身的问题(比如videoId无效),和WKWebView无关;如果Safari能正常显示,那再回到上面的配置和代理排查。
内容的提问来源于stack exchange,提问作者Patrik Rikama-Hinnenberg

