Swift中的UIWebView和JavaScriptInterface

如何从我的网站创建JavascriptInterface频道到我的UIWebView?

Android中的示例:

webView.addJavascriptInterface(new WebAppInterface(this), "Android"); 

从这个JavascriptInterface我想绘制方法,例如:

 func webViewDidStartLoad(webView: UIWebView) 

要么

 myActivityIndicator.startAnimating() 

我能怎么做?

对于WKWebView:source来源

JavaScript的

 function callNativeApp () { try { webkit.messageHandlers.callbackHandler.postMessage("Hello from JavaScript"); } catch(err) { console.log('The native context does not exist yet'); } } 

迅速

 import WebKit class ViewController: UIViewController, WKScriptMessageHandler { @IBOutlet var containerView: UIView? = nil var webView: WKWebView? override func loadView() { super.loadView() let contentController = WKUserContentController() contentController.addScriptMessageHandler(self, name: "callbackHandler") let config = WKWebViewConfiguration() config.userContentController = contentController self.webView = WKWebView( frame: self.containerView!.bounds, configuration: config) self.view = self.webView } override func viewDidLoad() { super.viewDidLoad() //I use the file html in local let path = NSBundle.mainBundle().pathForResource("index", ofType: "html") let url = NSURL(fileURLWithPath: path!) let req = NSURLRequest(URL: url) self.webView!.loadRequest(req) } func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage) {// edit: changed fun to func if (message.name == "callbackHandler"){ print("\(message.body)") } } } 

对于UIWebView:source来源

HTML中的JavaScript

    

迅速

 import UIKit class ViewController: UIViewController, UIWebViewDelegate { @IBOutlet weak var Web: UIWebView! override func viewDidLoad() { super.viewDidLoad() let path = NSBundle.mainBundle().pathForResource("index", ofType: "html") let url = NSURL(fileURLWithPath: path!) let req = NSURLRequest(URL: url) Web.delegate = self Web.loadRequest(req) } func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool { if request.URL?.query != nil { print("\(request.URL!.query!)") } return true } } 

这是一个简单的例子:

  1. 在Xcode中注册一个URL方案,例如foobar
  2. 在Web视图中处理此URL Scheme

     func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool { if request.URL?.query?.containsString("show_activity_indicator=true") { myActivityIndicator.startAnimating() } } 
  3. 最后,从您的JavaScript中调用它

     // Show your activity indicator from JavaScript. window.location = "foobar://fizz?show_activity_indicator=true" 

注意 :有关iOS中Web视图通信的更多信息,请参阅此处的问题 。