Javascript从UIWebView调用Swift

Ton*_*ild 5 javascript uiwebview swift ios10

我试图从UIWebView中的javascript函数调用到iOS 10中的Swift.我已经设置了一个非常基本的项目,只是为了尝试让它工作,代码如下.

import UIKit

class ViewController: UIViewController, UIWebViewDelegate  {    
  @IBOutlet var webView: UIWebView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let url = Bundle.main.url(forResource: "products", withExtension: "html")
        let request = NSURLRequest(url: url! as URL)
        webView.loadRequest(request as URLRequest)
    }

    @IBAction func closeDocumentViewer() {
        displayView.isHidden = true;
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我只是一个从javascript函数接收一个字符串,我将不得不添加到上面?

Tom*_*ski 15

我建议寻找到使用WKWebView代替UIWebView.然后,您将不需要注册自定义URL方案.此外,UIWebView已经过时,WKWebView具有很多优点,最显着的是性能和渲染,因为它在一个单独的进程中运行.

链接到Apple文档并建议使用WKWebView https://developer.apple.com/reference/webkit/wkwebview/

重要

从iOS 8.0和OS X 10.10开始,使用WKWebView将Web内容添加到您的>应用程序.不要使用UIWebView或WebView.

也就是说,设置本机到javascript桥非常简单:

import WebKit

class ViewController: UIViewController, WKScriptMessageHandler {
   var webView: WKWebView?
    override func loadView() {
        super.loadView()

        webView = WKWebView(frame: self.view.frame)
        webView?.configuration.userContentController.add(self, name: "scriptHandler")

        self.view.addSubview(webView!)
    }

    public func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        print("Message received: \(message.name) with body: \(message.body)")
    }
// rest of code
}
Run Code Online (Sandbox Code Playgroud)

然后在您的JavaScript代码中,将其命名为:

window.webkit.messageHandlers["scriptHandler"].postMessage("hello");
Run Code Online (Sandbox Code Playgroud)

我编写了一个利用它的库,并添加了一些奇特的javascript语法. https://github.com/tmarkovski/BridgeCommander

要使用它,只需引用项目(或将swift和javascript文件添加到Xcode项目中)并调用

    webView = WKWebView(frame: self.view.frame)
    let commander = SwiftBridgeCommander(webView!)

    commander.add("echo") {
        command in
        command.send(args: "You said: \(command.args)")
    }
Run Code Online (Sandbox Code Playgroud)

然后你就可以在这样的javascript中使用回调语法

var commander = new SwiftBridgeCommander();
commander.call("echo", "Hello", function(args) {
        // success callback
    }, function(error) { 
        // error callback
});
Run Code Online (Sandbox Code Playgroud)


pau*_*lvs 3

您必须自定义并使用URL Scheme以下方式myawesomeapp拦截对其的请求:

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool
Run Code Online (Sandbox Code Playgroud)

使用 触发对本机代码的调用,并获取您在本机代码中window.location=myawesomeapp://hello=world传递的查询参数。request.URL.query

有关更多信息,请参阅我关于UIWebViews 的问题:JavaScript synchronous native communications to WKWebView