WKWebView点击网页打印按钮无响应 如何用Swift监听并触发原生打印
WKWebView网页打印功能失效解决方案
根因说明
WKWebView默认没有实现对网页端window.print()调用的响应逻辑,因此浏览器中正常的打印功能在App内嵌WebView中会无法触发。你可以通过注入脚本监听网页打印事件,调用原生打印接口实现需求。
关联参考截图
修改后完整代码
import UIKit import WebKit // 新增遵守WKScriptMessageHandler协议 class MitarbeiterViewController: UIViewController, WKUIDelegate, WKScriptMessageHandler { var webView: WKWebView! override func loadView() { let webConfiguration = WKWebViewConfiguration() // 新增:注入JS脚本捕获window.print调用 let userScript = WKUserScript(source: "window.print = function() { window.webkit.messageHandlers.printEvent.postMessage('triggerPrint'); }", injectionTime: .atDocumentEnd, forMainFrameOnly: true) webConfiguration.userContentController.addUserScript(userScript) // 注册消息监听 webConfiguration.userContentController.add(self, name: "printEvent") webView = WKWebView(frame: .zero, configuration: webConfiguration) webView.uiDelegate = self view = webView } override func viewDidLoad() { super.viewDidLoad() let myURL = URL(string:"https://www.pizzeria-lo-straniero.de/mitarbeiterlogin") let myRequest = URLRequest(url: myURL!) webView.load(myRequest) } // 新增:接收网页发来的消息 func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { if message.name == "printEvent" { printRecipeWebViewController() } } // 新增:兼容iOS系统级别的打印面板回调(部分场景会走这个代理) func webView(_ webView: WKWebView, runJavaScriptPrintPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) { printRecipeWebViewController() completionHandler() } func printRecipeWebViewController(){ //MARK: - PRINT let webviewPrint = webView.viewPrintFormatter() let printInfo = UIPrintInfo(dictionary: nil) printInfo.jobName = "page" printInfo.outputType = .general let printController = UIPrintInteractionController.shared printController.printInfo = printInfo printController.showsNumberOfCopies = false printController.printFormatter = webviewPrint printController.present(animated: true, completionHandler: nil) } }
补充说明
如果你有权限修改前端网页代码,可以不用注入脚本覆盖window.print方法,直接在网页打印按钮的点击逻辑中调用window.webkit.messageHandlers.printEvent.postMessage({})即可,稳定性更高。你现有编写的打印逻辑无需额外修改即可正常使用。
内容的提问来源于stack exchange,提问作者yannik Hauser
相关产品推荐
相关产品推荐



