我在我的应用中使用WKWebView
,一切正常,直到用户转到money.cnn.com。对于此网站的主页,一切都很好,但当用户离开主页并转到例如http://money.cnn.com/2016/11/21/news/dubai-trump-golf-course-developer/index.html?iid=hp-toplead-intl或此网站上的任何其他页面时,委托方法didStartProvisionalNavigation
和didCommitNavigation
不叫。但我需要这些方法来检测导航的开始。 decidePolicyForNavigationAction
在一开始被调用,但它被多次调用,我觉得使用这种方法并不是一个完美的解决方案。所以我的问题是:在这种情况下我能做些什么?在那个网站上有什么特别的东西可以使WKWebView
调用它的委托方法,在这种情况下可能是一个可靠的解决方案?谢谢
答案 0 :(得分:2)
我不太了解网站开发,但在我看来,这是money.cnn.com网站的JavaScript问题。似乎网站页面之间的转换和它们的加载是在JavaScript的帮助下进行的。该JavaScript与本机WKWebView处理程序冲突。
但是!您可以在页面开头使用处理程序注入自己的JavaScript。当页面开始打开时,脚本将首先运行。
import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate, WKScriptMessageHandler {
var webView = WKWebView()
let scriptName = "GetUrl"
override func viewDidLoad() {
super.viewDidLoad()
let contentController = WKUserContentController();
let script = "webkit.messageHandlers.\(scriptName).postMessage(document.URL)"
let userScript = WKUserScript(source: script, injectionTime: WKUserScriptInjectionTime.atDocumentStart, forMainFrameOnly: true)
contentController.addUserScript(userScript)
contentController.add(self, name: scriptName)
let config = WKWebViewConfiguration()
config.userContentController = contentController
webView = WKWebView(frame: UIScreen.main.bounds, configuration: config)
webView.navigationDelegate = self
view.addSubview(webView)
}
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if message.name == scriptName {
if let url = message.body as? String {
if url.contains("http://money.cnn.com/") {
print("!!! \(url)")
}
}
}
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
loadUrl(string: "http://money.cnn.com/2016/11/21/news/dubai-trump-golf-course-developer/index.html?iid=hp-toplead-intl")
}
func loadUrl(string: String) {
if let url = URL(string: string) {
webView.load(URLRequest(url: url))
}
}
}
添加Info.plist传输安全设置
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
或
答案 1 :(得分:0)
将委托设置为:
webView.navigationDelegate = self