我正在尝试从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');
}
}