尝试从 WKWebView 中的 Javascript 获取信息(使用 KINWebBrowser)

Trying to get information back from Javascript in WKWebView (using KINWebBrowser)

所以我试图在某些客户端代码生成后从浏览器 window 取回一个值。

这是我的:

class WebBrowserViewController: KINWebBrowserViewController, NavigationProtocol, KINWebBrowserDelegate, WKScriptMessageHandler {

override func viewDidLoad() {
    super.viewDidLoad()

    let config = WKWebViewConfiguration()

    let contentController = WKUserContentController();
    contentController.add(
        self,
        name: "callbackHandler"
    )
...

func userContentController(_ userContentController: WKUserContentController!, didReceive message: WKScriptMessage) {
    print("Debug message got here")
    if(message.name == "callbackHandler") {
        print("JavaScript is sending a message \(message.body)")
    }
}

现在我 100% 确定这不是我需要的全部代码。

将其用作 example,在我看来我需要以某种方式将此配置添加到我的浏览器中:

self.webView = WKWebView(frame: webFrame, configuration: config)

这里的大问题是,这是针对直接 WkWebView 的,而我正在使用的项目正在使用 KinWebBrowser。似乎有一种方法可以扩展 KinWebBrowser,而不是从头开始使用全新的实现,但我还不完全熟悉 Swift 语法,或者 Objective-C,而且 KinWebBrowser 似乎是这样写的在 Objective-C.

我认为KinWebBrowser的相关接口定义如下:

@interface KINWebBrowserViewController : UIViewController <WKNavigationDelegate, WKUIDelegate, UIWebViewDelegate>

#pragma mark - Public Properties

@property (nonatomic, weak) id <KINWebBrowserDelegate> delegate;

// The main and only UIProgressView
@property (nonatomic, strong) UIProgressView *progressView;

// The web views
// Depending on the version of iOS, one of these will be set
@property (nonatomic, strong) WKWebView *wkWebView;
@property (nonatomic, strong) UIWebView *uiWebView;

- (id)initWithConfiguration:(WKWebViewConfiguration *)configuration NS_AVAILABLE_IOS(8_0);

#pragma mark - Static Initializers

/*
 Initialize a basic KINWebBrowserViewController instance for push onto navigation stack

 Ideal for use with UINavigationController pushViewController:animated: or initWithRootViewController:

 Optionally specify KINWebBrowser options or WKWebConfiguration
 */

+ (KINWebBrowserViewController *)webBrowser;
+ (KINWebBrowserViewController *)webBrowserWithConfiguration:(WKWebViewConfiguration *)configuration NS_AVAILABLE_IOS(8_0);

那么我该如何扩展 KinWebBrowser,以便在我调用此脚本时:

window.webkit.messageHandlers.callbackHandler.postMessage("Hello from JavaScript");

我会得到我传递给 .postMessage 的任何东西?

我的最终目标是在网络浏览器中生成字符串或其他数据后将其从网络中获取到我的 iOS 应用程序中 window。

看起来你做的一切都是正确的,但你不知道如何从你的应用程序执行脚本。要解决它,您可以使用evaluateJavaScript(_:completionHandler:)方法。

wkWebView.evaluateJavaScript("window.webkit.messageHandlers.callbackHandler.postMessage(\"Hello from JavaScript\");", completionHandler: nil)

更多详情,您可以查看my sample project