天天看點

swift4 - wkwebview互動

WKWebView用法介紹

本文swift與WKWebView互動Demo位址

前言:蘋果在iOS8中推出了webkit新架構,提供了WKWebview元件用來替換存在各種問題的UIWebview,用WKWebview加載網頁,相較于UIWebview速度更快了,記憶體占用更少了。WKWebview還提供了更加豐富的接口,功能更加強大,剛學習swift4,代碼撸了一個swift4版與WKWebView互動,特此分享出來,與大家共勉

1.首先Xcode連結手機,運作項目工程,打開html界面,然後選中電腦上的safari的開發工具,打開html調試器。

還不會電腦調試html?看這裡

使用safari對webview進行調試

項目運作成功,打開我們的調試器如圖
swift4 - wkwebview互動
打開之後的界面
swift4 - wkwebview互動

發現新大陸了,以後媽媽再也不用擔心我的成長了。

這裡是以我的上線項目工程為例。大家可以看到上圖中的互動,開出的get_selection_txt(),get_share_txt()等幾個方法,這是我們蘋果端需要調用執行的代碼,細心的同學會看到方法内部做了一個判斷。沒錯就是判斷是android或者是蘋果端的代碼。我們暫且不讨論android,主要看下蘋果端的這句代碼

從字面上可以看出,是前端向移動端發送指令的語句,這裡注意下webViewApp,這是一個互動關鍵。需要提前和前端人員商量好命名規則。我們兩端都需要用到

2.到這裡,前端的看的就差不多了,我們來看下swift版本的實作方法

swift4 - wkwebview互動
swift4 - wkwebview互動
private lazy var articleWeb : WKWebView = {
        let webView = WKWebView.init(frame: view.bounds, configuration: configutation)
        webView.allowsBackForwardNavigationGestures = true
        webView.navigationDelegate = self
        webView.uiDelegate = self
        webView.scrollView.delegate = self
        return webView
    }()

    private lazy var configutation: WKWebViewConfiguration = {
       let config = WKWebViewConfiguration()
        config.userContentController.addUserScript(String.userScript())
        config.userContentController.add(WeakScriptMessageDelegate.init(delegate: self), name: "webViewApp")
        return config
    }()

    private lazy var progressView : UIProgressView = {
        let pp = UIProgressView.init(frame: CGRect.init(x: , y: , width: view.frame.size.width, height: ))
        pp.tintColor = UIColor.blue
        pp.backgroundColor = UIColor.lightGray
        pp.transform = CGAffineTransform.init(scaleX: , y: )
        return pp
    }()

    func Menu() -> Void {
        let menu = UIMenuController.shared
        let item = UIMenuItem.init(title: "劃重點", action: #selector(point))
        let shareItem = UIMenuItem.init(title: "分享", action: #selector(share))
        let copyItem = UIMenuItem.init(title: "拷貝", action: #selector(copyAction))

        menu.menuItems = [item,shareItem,copyItem]
        menu.arrowDirection = .default
        menu.setTargetRect(articleWeb.bounds, in: articleWeb)
        menu.setMenuVisible(true, animated: true)

    }
           

.上圖中大家可以看到,用到了前端定義名稱webViewApp,實作互動

實作UIMenuController的點選方法,因為本文主要講解互動,對于建立UIMenuController不做重點解析

swift4 - wkwebview互動
@objc func point() {
        articleWeb.evaluateJavaScript("get_selection()", completionHandler: nil)
    }

    @objc func share() {
        articleWeb.evaluateJavaScript("get_selection_txt()", completionHandler: nil)
    }

    @objc func copyAction() {
        articleWeb.evaluateJavaScript("window.getSelection().toString()") { (object, error) in
            print(object!)
        }
    }

           

.這裡實作了點選方法,用到了上圖中前端定義好的方法。get_selection_txt(),get_selection()

3.細心的同學會發現,我有看到html往移動端發送資料啊。對。确實很多項目中很多情況下,都是我們調用前端方法,然後他們傳回給我們資料我們再進行邏輯和處理。這裡我們實作WKScriptMessageHandler這個代理方法,實作我們的需求。上代碼

swift4 - wkwebview互動
extension ArticleDetialViewController: WKScriptMessageHandler{
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        print(message.body)

    }
}
           

有興趣的同學,可以下載下傳文章頂部的demo進行調試,列印print(message.body),裡邊的資料即是前端傳遞給我們的資料。是不是很簡單呢

。OC版的如果小夥伴們有需要可以私信或者下方評論我會盡快出一個oc版的wkwebview互動

本文swift與WKWebView互動Demo位址

獻給所有和我一起奮鬥在swift4學習路上的小夥伴