最近項目里面用了一些h5的頁面驰怎,然后避免不了,要跟網(wǎng)頁交互二打。我用了UIwebView,也用了WKWebView∠丶桑現(xiàn)在分別說下我自己的兩種用法。
1继效、UIWebView:之前跟網(wǎng)頁交互症杏,基本就是攔截URL,跟前端的同事約好瑞信,攔截具有某些字符串的URL厉颤,可將攜帶的參數(shù)拼接在URL里面。主要就是實現(xiàn) webview的這個代理方法凡简。
func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
guard let url = request.url, let q = URLComponents(url: url, resolvingAgainstBaseURL: true)?.queryItems else { return true }
if url.absoluteString.contain("homeworkStu/saveStuHomeworkAnswer") {
print("點擊返回的鏈接是 == ",url)
var p = [String : Any]()
q.forEach({
if let v = $0.value {
p[$0.name] = v
}
})
self.saveAnwser(params: p)
return false
}
return true
}
我這里面實現(xiàn)的是逼友,點擊網(wǎng)頁上面的某個按鈕,然后我調(diào)用 saveAnwser()這個方法秤涩。我跟前端約定的就是帜乞,URL里面包含"homeworkStu/saveStuHomeworkAnswer"這個字符,然后將傳給我的參數(shù)都拼接到URL里面筐眷,我自己再來解析出來黎烈。這種可能傳參內(nèi)容少,還可以匀谣。但是如果前端要傳一個解析好的網(wǎng)絡(luò)請求結(jié)果給我們照棋,估計他們不愿意這種吧。
2振定、WKWebView:這種一樣必怜,也是要跟前端同事約定好,遵循 WKScriptMessageHandler 代理后频。
let config = WKWebViewConfiguration.init()
config.userContentController.add(self, name: "collectGzhu")
webView = WKWebView(frame: CGRect(x: 0, y: 0, width: UIScreen.w, height: app.isIphoneX ? (UIScreen.h - 88) : (UIScreen.h - 64)), configuration: config)
webView.navigationDelegate = self
webView.uiDelegate = self
webView.addObserver(self, forKeyPath: "estimatedProgress", options: NSKeyValueObservingOptions.new, context: nil)
self.view.addSubview(webView)
這里我跟前端同事約定的方法名就是 collectGzhu梳庆。然后就是實現(xiàn)這個代理方法。
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if message.name == "collectGzhu" {
print(message.body)
}
}
這種方法好像更簡便一些卑惜,前端直接把要穿給我們的內(nèi)容膏执,放在body里面。
//js端代碼實現(xiàn)實例(此處為js端實現(xiàn)代碼給大家粘出來示范的!!!):
//window.webkit.messageHandlers.collectGzhu.postMessage({body: 'name=1212'});
還有攔截網(wǎng)頁alert露久。就是實現(xiàn)這些代碼方法更米。
func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
self.alert(title: message, msg: message)
completionHandler()
}
func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) {
self.alert(title: message, msg: message)
completionHandler(true)
}
func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Void) {
self.alert(title: prompt, msg: prompt)
completionHandler(nil)
}
這里面的 completionHandler 回調(diào)必須寫,我之前沒寫 completionHandler毫痕,一直崩潰征峦,后來在網(wǎng)上找到的解決辦法迟几,就是要把completionHandler寫上去。