我正在尝试在我的应用程序中使用WKWebView捕获window.print() javascript调用,以实际显示打印对话框并允许用户从页面上呈现的按钮进行打印(而不是在我的应用程序内部的按钮)。 有人知道实现这一点的最佳方法吗?
目前,对于我来说,单击调用window.print()的链接什么都不做,只触发decidePolicyForNavigationAction委托方法,我找不到任何相关内容。
我正在尝试在我的应用程序中使用WKWebView捕获window.print() javascript调用,以实际显示打印对话框并允许用户从页面上呈现的按钮进行打印(而不是在我的应用程序内部的按钮)。 有人知道实现这一点的最佳方法吗?
目前,对于我来说,单击调用window.print()的链接什么都不做,只触发decidePolicyForNavigationAction委托方法,我找不到任何相关内容。
发布后马上就想到了(显然)...希望这能帮助其他人。
在创建你的网页视图时...
let configuration = WKWebViewConfiguration()
let script = WKUserScript(source: "window.print = function() { window.webkit.messageHandlers.print.postMessage('print') }", injectionTime: WKUserScriptInjectionTime.AtDocumentEnd, forMainFrameOnly: true)
configuration.userContentController.addUserScript(script)
configuration.userContentController.addScriptMessageHandler(self, name: "print")
self.webView = WKWebView(frame: CGRectZero, configuration: configuration)
那么只需在您的视图控制器中采用WKScriptMessageHandler协议并添加所需的方法即可...
func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage) {
if message.name == "print" {
printCurrentPage()
} else {
println("Some other message sent from web page...")
}
}
func printCurrentPage() {
let printController = UIPrintInteractionController.sharedPrintController()
let printFormatter = self.webView.viewPrintFormatter()
printController?.printFormatter = printFormatter
let completionHandler: UIPrintInteractionCompletionHandler = { (printController, completed, error) in
if !completed {
if let e = error? {
println("[PRINT] Failed: \(e.domain) (\(e.code))")
} else {
println("[PRINT] Canceled")
}
}
}
if let controller = printController? {
if UIDevice.currentDevice().userInterfaceIdiom == .Pad {
controller.presentFromBarButtonItem(someBarButtonItem, animated: true, completionHandler: completionHandler)
} else {
controller.presentAnimated(true, completionHandler: completionHandler)
}
}
}
self.browserController.addressBarActivityButton
是什么? - Lukasz 'Severiaan' Grela有一个用于挂钩 window.print() 的 未记录的 委托。
class MyApp: WKUIDelegate {
func makeWebview() {
...
self.webview.UIDelegate = self
}
func _webView(webView: WKWebView!, printFrame: WKFrameInfo) {
println("JS: window.print()")
printCurrentPage()
}
}