Javascript call to Swift from UIWebView



我正在尝试从iOS 10中的uiwebview中的javascript函数拨打呼叫。。

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()
    }
}

如果我只是从JavaScript函数接收一个字符串,我必须添加到上面的内容?

我建议您考虑使用WKWebView而代替UIWebView。然后,您无需注册自定义URL方案。此外,uiwebview是过时的,WKWebView具有很大的优势,最著名的是性能和渲染,因为它在单独的过程中运行。

链接到Apple文档和建议使用WKWebViewhttps://developer.apple.com/reference/webkit/wkwebview/

重要

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

也就

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
}

然后在您的JavaScript代码中,调用:

window.webkit.messageHandlers["scriptHandler"].postMessage("hello");

我编写了一个利用这一点并添加一些精美的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)")
    }

然后,您将能够在JavaScript中使用回调语法

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

您必须使用自定义URL Scheme,例如myawesomeapp,并使用:

拦截对其进行拦截请求
func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool

使用 window.location=myawesomeapp://hello=world向本机代码发出调用,并在本机代码中从 request.URL.query中获取查询参数。

有关更多信息,请参阅我有关UIWebView S的问题:JavaScript同步本机通信wkwebview

我们可以在 wkscriptMessageHandler

的帮助下调用JavaScript的Swift函数

符合WKScriptMessageHandler协议的类提供了一种从网页上运行JavaScript的消息的方法。

我们需要将侦听器添加到我们的WkuserContentController

 let contentController = WKUserContentController()
    contentController.add(self, name: "loginAction”)

我们必须实现其usercontentController才能接收从JavaScript发送的内容。对于前。仅限于我们现在想要的"注销"。

  func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {       
       if message.name == "logout" {
           print("JavaScript is sending a message (message.body)")
       }
   }

从javascript结束时,他们必须这样实现:

 function sendLogoutAction() {
       try {
           webkit.messageHandlers.logout.postMessage("logout");
       } catch(err) {
           console.log('The native context does not exist yet');
       }
    }

最新更新