提问人:유현명 提问时间:11/6/2023 最后编辑:유현명 更新时间:11/6/2023 访问量:34
iOS WKWebView 代码无法通过“postMessage”桥接与 Web 的通信
The iOS WKWebView code cannot bridge communication to the web through 'postMessage'
问:
调用 Web 视图时,当 Web 视图内发生操作时,String 值将通过 Web 端的“postMessage”传递。
但是,目前我的代码不知道来自网络的任何请求。
错误发生在哪里并不重要。它只是不检测来自网络的任何请求。
我使用的 Web 代码
product.onClick = () => {
sendToApp(product.id)
;
export const sendToApp = (path: string) => {
try {
Router.postMessage(path);
} catch (e) {
devLog('--------ERROR--------');
}
};
我的 WebView 代码
import SwiftUI
import UIKit
import WebKit
public struct WebViewStruct: UIViewRepresentable {
// ...
public func makeCoordinator() -> WebCoordinator {
WebCoordinator(self)
}
public func makeUIView(context: Context) -> WKWebView {
let webView = WKWebView(frame: CGRect.zero, configuration: generateWKWebViewConfiguration())
webView.navigationDelegate = context.coordinator
webView.scrollView.delegate = context.coordinator
let myURL: URL = URL(string: "URL")!
let request = URLRequest(url: myURL)
webView.load(request)
return webView
}
public func updateUIView(_ webView: WKWebView, context: Context) { }
}
extension WebViewStruct {
func generateWKWebViewConfiguration() -> WKWebViewConfiguration {
let preferences = WKPreferences()
preferences.javaScriptCanOpenWindowsAutomatically = false
let configuration = WKWebViewConfiguration()
configuration.preferences = preferences
self.registerBridge(name:
"Router",
configuration: configuration)
return configuration
}
private func registerBridge(name: String, configuration: WKWebViewConfiguration) {
configuration.userContentController.add(self.makeCoordinator(), name: name)
}
}
网络协调员
public class WebCoordinator: NSObject, WKNavigationDelegate, WKScriptMessageHandler, UIScrollViewDelegate {
var parent = try! WebViewStruct()
init(_ uiWebView: WebViewStruct) {
self.parent = uiWebView
}
public func webView(_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
return decisionHandler(.allow)
}
public func userContentController(_ userContentController: WKUserContentController,
didReceive message: WKScriptMessage) {
if message.name == "Router" {
self.productClicked(message.body)
print("messageBody")
}
}
public func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) {
scrollView.pinchGestureRecognizer?.isEnabled = false
}
}
extension WebCoordinator {
private func productClicked(_ messageBody: Any) {
print(messageBody) // Not Working
}
}
这个问题似乎是我缺乏iOS开发经验造成的。请帮帮我
答: 暂无答案
评论