JavaScript 调用 iOS WebView 主要涉及到在 iOS 应用中使用 WKWebView
组件来实现网页与原生应用之间的交互。以下是关于这个问题的基础概念、优势、类型、应用场景以及常见问题和解决方案的详细解答。
WKWebView
是 iOS 8 及以上版本中用于显示网页内容的组件,它提供了比 UIWebView
更好的性能和更多的功能。通过 WKWebView
,JavaScript 可以与原生代码进行双向通信。
WKWebView
比 UIWebView
更快,内存占用更少。import WebKit
class ViewController: UIViewController, WKNavigationDelegate {
var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
let config = WKWebViewConfiguration()
webView = WKWebView(frame: view.bounds, configuration: config)
webView.navigationDelegate = self
view.addSubview(webView)
if let url = URL(string: "https://example.com") {
let request = URLRequest(url: url)
webView.load(request)
}
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
let jsString = "alert('Hello from Swift!')"
webView.evaluateJavaScript(jsString) { (result, error) in
if let error = error {
print("Error executing JavaScript: \(error)")
}
}
}
}
首先,在原生代码中定义一个协议并实现它:
import WebKit
@objc protocol JavaScriptHandler {
func handleJavaScriptCall(_ message: String)
}
class ViewController: UIViewController, WKNavigationDelegate, JavaScriptHandler {
var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
let config = WKWebViewConfiguration()
let userContentController = WKUserContentController()
userContentController.add(self, name: "nativeHandler")
config.userContentController = userContentController
webView = WKWebView(frame: view.bounds, configuration: config)
webView.navigationDelegate = self
view.addSubview(webView)
if let url = URL(string: "https://example.com") {
let request = URLRequest(url: url)
webView.load(request)
}
}
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if message.name == "nativeHandler", let messageBody = message.body as? String {
handleJavaScriptCall(messageBody)
}
}
func handleJavaScriptCall(_ message: String) {
print("Received message from JavaScript: \(message)")
}
}
然后在网页中使用 JavaScript 发送消息:
<!DOCTYPE html>
<html>
<head>
<title>JavaScript to Native</title>
<script>
function sendMessageToNative() {
window.webkit.messageHandlers.nativeHandler.postMessage("Hello from JavaScript!");
}
</script>
</head>
<body>
<button onclick="sendMessageToNative()">Send Message to Native</button>
</body>
</html>
原因:可能是由于 WKScriptMessageHandler
没有正确注册或者消息名称不匹配。
解决方案:
WKWebViewConfiguration
中正确添加了 WKUserContentController
并注册了处理程序。原因:可能是由于 evaluateJavaScript
方法在网页未完全加载时被调用。
解决方案:
webView(_:didFinish:)
回调中调用 evaluateJavaScript
方法。通过以上内容,你应该能够全面了解 JavaScript 调用 iOS WebView 的相关知识,并能够解决常见的交互问题。
领取专属 10元无门槛券
手把手带您无忧上云