Swift 3.0 WKWebView 如何拦截网页端发出的协议

发布于 2022-09-05 10:58:10 字数 2336 浏览 23 评论 0

最近想研究一下 Native 和 Web 之间的交互,了解了一下 Web 端可以发送类似 command://do?hello=world 的自定义协议来向 Native 端交互,然后通过 delegate 函数在 Native 层接收到通知。

写了下面这个非常简单的 demo 后,发现 webView() 方法并没有执行,本人对 iOS 和 Swift 都不是很了解,不知道问题出在哪里。


import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {
    
    var webView: WKWebView?
    var configure: WKWebViewConfiguration?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.configure = WKWebViewConfiguration()
        
        self.configure?.preferences = WKPreferences()
        self.configure?.preferences.javaScriptEnabled = true
        
        self.webView = WKWebView(frame: self.view.bounds, configuration: self.configure!)
        self.view.addSubview(webView!)

        self.webView?.navigationDelegate = self
        self.webView?.uiDelegate = self
    }
    
    override func viewWillAppear(_ animated: Bool) {
        print("viewWillAppear")
        super.viewWillAppear(animated)
        self.webView?.loadResource(string: "web-content/index")
    }
    
    override func didReceiveMemoryWarning() {
        print("didReceiveMemoryWarning")
        super.didReceiveMemoryWarning()
    }
    
    func webView(webView: WKWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Void {
        print("webView")
    }
    
    func webViewDidStartLoad(webView: WKWebView) {
        print("webViewDidStartLoad")
    }
}

extension WKWebView {
    func loadUrl(string: String) {
        if let url = URL(string: string) {
            load(URLRequest(url: url))
        }
    }
    
    func loadResource(string: String) {
        let url = Bundle.main.url(forResource: string, withExtension: "html")!
        let request: NSURLRequest = NSURLRequest(url: url as URL)
        
        load(request as URLRequest);
    }
}

主要目的就是当 Web 端发起协议的时候,Native 能接收到信息。

============ 分割线 ============

后面问朋友后发现是 delegate 函数错了,应该是这样才对:

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    print("hello world")
    decisionHandler(WKNavigationActionPolicy.allow)
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文