Ios8 从WKWebView捕获window.print()

Ios8 从WKWebView捕获window.print(),ios8,wkwebview,wkwebviewconfiguration,Ios8,Wkwebview,Wkwebviewconfiguration,我试图用我的应用程序从WKWebView捕获window.print()javascript调用,以实际显示打印对话框,并允许它们从页面上显示的按钮(而不是我应用程序中的按钮)打印。有人知道实现这一目标的最佳方法吗 目前,对我来说,单击调用window.print()的链接只会触发decidePolicyForNavigationAction委托方法,而我在其中找不到任何相关内容。在发布后(显然)。。。希望这能帮助其他人 创建web视图时 let configuration = WKWebVie

我试图用我的应用程序从WKWebView捕获window.print()javascript调用,以实际显示打印对话框,并允许它们从页面上显示的按钮(而不是我应用程序中的按钮)打印。有人知道实现这一目标的最佳方法吗


目前,对我来说,单击调用window.print()的链接只会触发decidePolicyForNavigationAction委托方法,而我在其中找不到任何相关内容。

在发布后(显然)。。。希望这能帮助其他人

创建web视图时

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)
        }
    }
}
有一个用于挂接window.print()s的委托


我可以问一下您正在打印哪个视图吗?我正在打印WKWebView的ViewPrintFormatter看起来很奇怪,他们公开了用于创建新窗口的委托方法,但将此方法保留为私有。希望他们将来能改变这一点。如果你的应用不需要苹果批准,这可能是一个好办法。WebView“私有”方法并不那么私有,很多人在提交应用商店时使用它们,甚至在将它们升级为公共方法后支持带下划线的函数签名。举个例子,苹果在iOS9/OSX10.11中为WKWebView添加了一个新的私有方法:_printOperationWithPrintInfo:iPad的
self.browserController.addressBarActivityButton
?在iPad上,你必须从按钮/视图显示打印控制器。这只是我展示的一个按钮项目。从我的项目复制代码时留下的。
class MyApp: WKUIDelegate {
  func makeWebview() {
      ...
      self.webview.UIDelegate = self
  }
  func _webView(webView: WKWebView!, printFrame: WKFrameInfo) {
      println("JS: window.print()")
      printCurrentPage()
  }     
}