之前的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)
}
}