【问题标题】:How to get url from webview whenever user move to other pages每当用户移动到其他页面时如何从 webview 获取 url
【发布时间】:2017-06-13 23:57:22
【问题描述】:

当 URL 发生更改时,如何从 webView 获取 URL?

我想在当前 URL 更改时更改按钮颜色。所以我需要一直检查当前的URL。

我还想将 URL 值作为字符串获取。

我尝试了下面的代码,但它根本不起作用。

NotificationCenter.default.addObserver(self, selector: #selector(urlChecker), name: NSNotification.Name.NSURLCredentialStorageChanged, object: webView)

【问题讨论】:

标签: swift url webview notifications nsurl


【解决方案1】:

你可以使用:

1。解决方案

UIWebViewDelegate

https://developer.apple.com/reference/uikit/uiwebviewdelegate/1617945-webview

optional func webView(_ webView: UIWebView, 
  shouldStartLoadWith request: URLRequest, 
       navigationType: UIWebViewNavigationType) -> Bool

UIWebViewNavigationType:

https://developer.apple.com/reference/uikit/uiwebviewnavigationtype

别忘了回true

case linkClicked

用户点击了一个链接。

case formSubmitted

用户提交了一个表单。

case backForward

用户点击了后退或前进按钮。

case reload

用户点击了重新加载按钮。

case formResubmitted

用户重新提交了表单。

case other

发生了其他一些操作。

2。解决方案

注入 Javascript JavaScript MessageHandler

(感谢Vasily Bodnarchuk

解决方案在这里:https://stackoverflow.com/a/40730365/1930509

Swift 3 示例。

说明

脚本被插入到将在 WKWebView 中显示的页面中。 此脚本将返回页面 URL(但您可以编写另一个 JavaScript 代码)。这意味着脚本事件是在 网页,但它将在我们的函数中处理:

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {...}

完整代码示例

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate {

    var webView = WKWebView()
    let getUrlAtDocumentStartScript = "GetUrlAtDocumentStart"
    let getUrlAtDocumentEndScript = "GetUrlAtDocumentEnd"
     override func viewDidLoad() {
             super.viewDidLoad()

            let config = WKWebViewConfiguration()
            config.addScript(script: WKUserScript.getUrlScript(scriptName: getUrlAtDocumentStartScript),
 scriptHandlerName:getUrlAtDocumentStartScript, scriptMessageHandler:
 self, injectionTime: .atDocumentStart)
            config.addScript(script: WKUserScript.getUrlScript(scriptName: getUrlAtDocumentEndScript),
scriptHandlerName:getUrlAtDocumentEndScript, scriptMessageHandler:
self, injectionTime: .atDocumentEnd)


             webView = WKWebView(frame:  UIScreen.main.bounds, configuration: config)
            webView.navigationDelegate = self
             view.addSubview(webView)
        }

     override func viewDidAppear(_ animated: Bool) {
         super.viewDidAppear(animated)
         webView.loadUrl(string: "http://apple.com")
    }
}
extension ViewController: WKScriptMessageHandler {
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        switch message.name {

            case getUrlAtDocumentStartScript:
                print("start: \(message.body)")

            case getUrlAtDocumentEndScript:
                print("end: \(message.body)")

            default:
                break;
        }
    }
}

extension WKUserScript {
    class func getUrlScript(scriptName: String) -> String {
        return "webkit.messageHandlers.\(scriptName).postMessage(document.URL)"
    }
}

extension WKWebView {
    func loadUrl(string: String) {
        if let url = URL(string: string) {
            load(URLRequest(url: url))
        }
    }
}
 extension WKWebViewConfiguration {
        func addScript(script: String, scriptHandlerName:String, scriptMessageHandler: WKScriptMessageHandler,injectionTime:WKUserScriptInjectionTime) {
             let userScript = WKUserScript(source: script, injectionTime: injectionTime, forMainFrameOnly: false)
             userContentController.addUserScript(userScript)
             userContentController.add(scriptMessageHandler, name: scriptHandlerName)
        }
    }

Info.plist

添加 Info.plist 传输安全设置

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

结果

资源##

Document Object Properties and Methods

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 2012-05-29
    • 2011-06-17
    相关资源
    最近更新 更多