Swift 3.0 WKWebView 如何拦截网页端发出的协议
最近想研究一下 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论