简介
随意移动互联网的飞速发展,移动应用技术的方案也变得丰富起来了
1、纯原生开发 Objective-C、Swift、Java、Kotlin
2、原生+跨平台混合开发 ReactNative、Flutter
3、原生+H5混合开发✔️
更是随着科技的发展,5G的到来,网速越来越快,H5页面在移动应用上表现的越来越优秀,很多时候我们不得不选择原生+H5的混合开发方案,以便能够快速适应产品需求。接下来我们就看看iOS最新的web组件WKWebView如何与原生交互共存的。
下面的场景需要我们加载一个简单的本地html文件来测试
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代码
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
初始化是有个三个参数
- source: JavaScript代码字符串
- injectionTime: 注入的时机,.atDocumentStart document元素刚创建,其他资源还未加载完成时;.atDocumentEnd 文档加载完成时(图片等附属资源有可能还没有加载完成) forMainFrameOnly: 是否只在main frame起作用
- JavaScript调用Native
调用原生分三个步骤
注册调用原生的事件userContentController.add(scriptMessageHandler, name: “share”) 继承WKScriptMessageHandler协议,实现里面的方法,该方法用来接收js事件 web触发事件window.webkit.messageHandlers.{name}.postMessage(params); name为事件名,params为事件参数, 在协议方法参数message.body中获取.
接收示例
class YNScriptMessageHandler: NSObject, WKScriptMessageHandler {
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
switch message.name {
case "share":
default:
print("default")
}
}
}
触发示例
window.webkit.messageHandlers.share.postMessage(params);
Native调用JavaScript
该方法是异步调用
message.webView?.evaluateJavaScript("shareCallback(1)", completionHandler: { (result, error) in
})
测试文件 index.html
<!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>