【问题标题】:Trying to get information back from Javascript in WKWebView (using KINWebBrowser)试图从 WKWebView 中的 Javascript 获取信息(使用 KINWebBrowser)
【发布时间】:2018-05-01 23:57:54
【问题描述】:

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

这是我所拥有的:

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的任何东西?

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

【问题讨论】:

  • 据我了解,当您从本机端执行某些操作时,您希望通过调用 window.webkit.messageHandlers.callbackHandler.postMessage("Hello from JavaScript"); 从 webView 获取数据。对吗?
  • 是的,正确,我想从原生端获取信息返回到应用程序
  • 您将在哪里触发操作以获取信息?单击 webView 上的按钮或从应用程序执行操作?
  • 这将作为登录或初始化过程的一部分发生。虽然不是超级相关。
  • 很难说出您的要求。能详细解释一下吗?

标签: javascript ios objective-c swift wkwebview


【解决方案1】:

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

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

更多详情可以查看my sample project

【讨论】:

  • 这个解决方案如何使用 KinWebBrowser?
  • 哦,抱歉没有看到示例。我去看看
  • 没问题,如果它不适合您的问题或者您需要其他东西,请告诉我。
  • 我今天没有时间测试它。我很快就会测试它
  • 那么你是为哪个版本制作的?我的 xcode 卡住了,说项目版本不兼容。
猜你喜欢
  • 1970-01-01
  • 2019-02-13
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 2012-07-05
  • 2011-11-23
  • 2020-04-14
相关资源
最近更新 更多