Listed


WKWebView(二)--和原生交互

简介 #

随意移动互联网的飞速发展,移动应用技术的方案也变得丰富起来了

1、纯原生开发 Objective-C、Swift、Java、Kotlin
2、原生+跨平台混合开发 ReactNative、Flutter
3、原生+H5混合开发✔️

更是随着科技的发展,5G的到来,网速越来越快,H5页面在移动应用上表现的越来越优秀,很多时候我们不得不选择原生+H5的混合开发方案,以便能够快速适应产品需求。接下来我们就看看iOS最新的web组件WKWebView如何与原生交互共存的。

下面的场景需要我们加载一个简单的本地html文件来测试

1
2
3
4
let filePath = Bundle.main.path(forResource: "h5/index", ofType: "html")!
let myURL = URL(fileURLWithPath: filePath)
let myRequest = URLRequest(url: myURL)
webView.load(myRequest)

:::tip 当加载远程不安全的链接(http)时,需要在info.plist文件添加App Transport Security Settings-Allow Arbitrary Loads为YES :::

嵌入JavaScript代码 #

通过WKUserScript注入JavaScript代码

1
2
3
4
5
6
7
let contentController = WKUserContentController()
let scriptSource = "document.body.style.backgroundColor = `red`;"
let script = WKUserScript(source: scriptSource, injectionTime: .atDocumentEnd, forMainFrameOnly: true)
contentController.addUserScript(script)

let config = WKWebViewConfiguration()
config.userContentController = contentController

初始化是有个三个参数

调用原生分三个步骤

注册调用原生的事件userContentController.add(scriptMessageHandler, name: “share”) 继承WKScriptMessageHandler协议,实现里面的方法,该方法用来接收js事件 web触发事件window.webkit.messageHandlers.{name}.postMessage(params); name为事件名,params为事件参数, 在协议方法参数message.body中获取.

接收示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class YNScriptMessageHandler: NSObject, WKScriptMessageHandler {
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        switch message.name {
        case "share":
            
        default:
            print("default")
        }
    }
}

触发示例

1
window.webkit.messageHandlers.share.postMessage(params);

Native调用JavaScript #

该方法是异步调用

1
2
3
message.webView?.evaluateJavaScript("shareCallback(1)", completionHandler: { (result, error) in
    
})

测试文件 index.html

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width,initial-scale=1, user-scalable=no" />
    <title>h5</title>
</head>
<body>
    <div style="margin-top: 20px">
        <h2 style="text-align: center">iOS和JavaScript交互</h1>
    </div>
    <div>
        <input type="button" value="share" onclick="shareHandler()">
    </div>
    <script>
    function shareHandler() {
        var info = {
            "title": "标题",
            "desc": "内容",
            "shareUrl": "http://xuyunan.github.io",
            "shareIcon": "https://cdn.pixabay.com/photo/2019/03/12/18/00/kerala-4051412_1280.jpg"
        }
        window.webkit.messageHandlers.share.postMessage(info);
    }
    function shareCallback(result) {
        console.log(result);
    }
    </script>
</body>
</html>

参考 #

nshipster.cn
JavaScript Manipulation on iOS Using WebKit