6

アプリで WKWebView から window.print() javascript 呼び出しをキャプチャして、実際に印刷ダイアログを表示し、(アプリ内のボタンではなく) ページに表示されたボタンから印刷できるようにしようとしています。これを達成するための最良の方法を知っている人はいますか?

現在、私にとっては、window.print() を呼び出すリンクをクリックしても、decisionPolicyForNavigationAction デリゲート メソッドが起動されるだけで、関連するものは何も見つかりませんでした。

4

2 に答える 2

12

(明らかに)投稿した直後にそれを理解しました...うまくいけば、これは他の誰かに役立ちます。

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)
        }
    }
}
于 2014-11-30T23:46:10.847 に答える
0

window.print()s をフックするための文書化されていないデリゲートがあります。

class MyApp: WKUIDelegate {
  func makeWebview() {
      ...
      self.webview.UIDelegate = self
  }
  func _webView(webView: WKWebView!, printFrame: WKFrameInfo) {
      println("JS: window.print()")
      printCurrentPage()
  }     
}
于 2015-02-05T08:25:10.863 に答える