You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 09:39:03