swift5調(diào)用H5頁(yè)面,H5調(diào)用swift5,參數(shù)傳遞

之前的webview等組件官方已經(jīng)不支持了,文檔中都已經(jīng)標(biāo)記廢棄了,現(xiàn)在要使用WKWebView,官方說(shuō)這個(gè)新的組件性能更高更安全,建議大家都轉(zhuǎn)這個(gè)來(lái)使用。具體步驟如下:
1.首先WKWebView所在controller一定要繼承WKNavigationDelegate ,WKScriptMessageHandler,xcode會(huì)提示你實(shí)現(xiàn)擴(kuò)展方法,一個(gè)是webView一個(gè)是userContentController,當(dāng)然還有其他方法可以查閱文檔
接下來(lái)直接給出代碼然后再進(jìn)行說(shuō)明

class UserCenterViewController: UIViewController, WKNavigationDelegate, WKScriptMessageHandler {
    lazy var webView: WKWebView = {
        
        let preferences = WKPreferences()
        //preferences.javaScriptEnabled = true
        let configuration = WKWebViewConfiguration()
        configuration.preferences = preferences
        configuration.userContentController = WKUserContentController()
        //注冊(cè)changePwdByJS這個(gè)函數(shù),讓js調(diào)用
        configuration.userContentController.add(self, name: "changePwdByJS")
        configuration.userContentController.add(self, name: "getUserInfoByJS")
        var webView = WKWebView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height), configuration: configuration)
        webView.scrollView.bounces = true
        webView.scrollView.alwaysBounceVertical = true
        webView.navigationDelegate = self
        return webView
    }()
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        automaticallyAdjustsScrollViewInsets = false
        view.addSubview(webView)
        //加載H5頁(yè)面
        let myURL = URL(string: H5_SERVER + USER_CENTER)
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }
    @objc private func goBackMenu() {
        webView.evaluateJavaScript("goBackMenuByIOS()") { (result, err) in
//            print("goBackMenuByIOS")
//            print(result)
//            print(err)
        }
    }  
  func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        //web加載好了才有左邊按鈕
        leftBtton = UIButton()
        leftBtton.setImage(UIImage(name:"back"), for: .normal)
        leftBtton.addTarget(self, action: #selector(goBackMenu), for: .touchUpInside)
        self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: leftBtton)
            
    }
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        
        print("-------------" + message.name)
        
        if message.name == "changePwdByJS" {
           
            print(message.body as! [String])
            
        }else if message.name == "getUserInfoByJS" {
            //進(jìn)入個(gè)人中心的時(shí)候,H5調(diào)我獲取下用戶的數(shù)據(jù)
            let user = UserDefaults.standard
            let json = JSON([
                USER_NAME: user.string(forKey: USER_NAME) as Any,
                USER_ID: user.string(forKey: USER_ID) as Any,
            ])
            
            let s: String = json.rawString()!
            webView.evaluateJavaScript("getUserInfoByIOS(" + s + ")", completionHandler: nil)
        }
    }
}

2.swift調(diào)用js,切記一定要等加載完了才能調(diào)用,這個(gè)帶有didFinsh參數(shù)的webView被自動(dòng)調(diào)用的時(shí)候就是加載完頁(yè)面的時(shí)候,假如說(shuō)有個(gè)按鈕是要點(diǎn)擊下彈出個(gè)網(wǎng)頁(yè),這個(gè)時(shí)候可以在webView這個(gè)方法中初始化這個(gè)按鈕并為它加事件,因?yàn)檫@樣可以保證這個(gè)按鈕被點(diǎn)擊的時(shí)候網(wǎng)頁(yè)被加載完了,這樣就不會(huì)報(bào)錯(cuò)說(shuō)js未加載完

    @objc private func goBackMenu() {
        webView.evaluateJavaScript("goBackMenuByIOS()") { (result, err) in
//            print("goBackMenuByIOS")
//            print(result)
//            print(err)
        }
    }  
  func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        //web加載好了才有左邊按鈕
        leftBtton = UIButton()
        leftBtton.setImage(UIImage(name:"back"), for: .normal)
        leftBtton.addTarget(self, action: #selector(goBackMenu), for: .touchUpInside)
        self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: leftBtton)
            
    }

2.js調(diào)用swift,上面代碼樣例中注冊(cè)了兩個(gè)函數(shù)changePwdByJS,getUserInfoByJS,這兩個(gè)函數(shù)可以被JS調(diào)用,具體就是下面這段代碼,沒(méi)啥好解釋的應(yīng)該都能明白

    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        
        print("-------------" + message.name)
        
        if message.name == "changePwdByJS" {
           
            print(message.body as! [String])
            
        }else if message.name == "getUserInfoByJS" {
         
            let user = UserDefaults.standard
            let json = JSON([
                USER_NAME: user.string(forKey: USER_NAME) as Any,
                USER_ID: user.string(forKey: USER_ID) as Any,
            ])
            
            let s: String = json.rawString()!
            webView.evaluateJavaScript("getUserInfoByIOS(" + s + ")", completionHandler: nil)
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容