iOS WKWebView 代码无法通过“postMessage”桥接与 Web 的通信

The iOS WKWebView code cannot bridge communication to the web through 'postMessage'

提问人:유현명 提问时间:11/6/2023 最后编辑:유현명 更新时间:11/6/2023 访问量:34

问:

调用 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开发经验造成的。请帮帮我

iOS WebKit WKWebView 桥接器

评论


答: 暂无答案