ios WKWebView未显示打印页

pinkon5k  于 2023-08-08  发布在  iOS
关注(0)|答案(1)|浏览(128)
import UIKit
import WebKit

class ViewController: UIViewController, WKUIDelegate{
    
    @IBOutlet weak var webVw: WKWebView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Load a URL
        if let url = URL(string: "https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_print") {
            let request = URLRequest(url: url)
            webVw.load(request)
        }
    }
}

字符串


的数据
“打印此页”按钮不显示任何东西,但在safari中加载相同的url并单击显示打印页选项的相同按钮。


rggaifut

rggaifut1#

抱歉之前误会你了
所以,我们需要一个变通办法。我们将使用WKUserScript的JavaScript注入来捕获WKWebView中的window.print()函数调用。这是可能的,因为Swift与WKWebView中的JavaScript具有互操作性。
现在,让我们剖析代码:
1.**创建打印脚本:**我们使用JavaScript代码片段构造WKUserScript对象,该代码片段重新定义了window.print()函数。在我们的版本中,它使用WebKit消息处理程序window.webkit.messageHandlers.printHandler.postMessage('print')发送消息。

let printScript = WKUserScript(
    source: "window.print = function(){window.webkit.messageHandlers.printHandler.postMessage('print')};",
    injectionTime: .atDocumentEnd,
    forMainFrameOnly: true
)

字符串
1.**注入脚本:**我们需要通过WKWebView的配置将此脚本注入到WKWebView中,其中包含一个用户内容控制器。我们还为'printHandler'添加了一个消息处理程序,它将捕获我们在JavaScript中设置的消息。

let config = WKWebViewConfiguration()
config.userContentController.addUserScript(printScript)
config.userContentController.add(self, name: "printHandler")


1.**设置WKWebView:**现在,使用配置初始化WKWebView。但是,由于WebView被分配给弱属性,导致其立即释放,因此会出现早期警告。因此,我们将利用故事板中已经设置好的WKWebView,它由ARC管理。
1.**URL加载:**这里我们照常加载URL。
1.处理脚本消息:WKScriptMessageHandler协议实现帮助我们处理打印消息的接收。当我们收到“printHandler”消息时,我们调用一个本机函数printPage()

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    if message.name == "printHandler" {
        printPage()
    }
}


1.打印功能:printPage()功能中,我们使用UIPrintInteractionController来呈现系统打印对话框。

private func printPage() {
    let printInfo = UIPrintInfo(dictionary: nil)
    printInfo.jobName = webVw.url?.absoluteString ?? "Document"
    printInfo.outputType = .general

    let printController = UIPrintInteractionController.shared
    printController.printInfo = printInfo
    printController.printFormatter = webVw.viewPrintFormatter()

    printController.present(animated: true, completionHandler: nil)
}


这个解决方案在某种程度上是网页的JavaScript环境和我们的本机代码之间的桥梁。
现在,如果window.print()函数没有按预期被调用,你应该检查网页上运行的JavaScript代码。window.print()函数可能是在页面加载之后定义的,覆盖了您的自定义函数。您可以使用轮询来一致地检查window.print()函数的定义,如果它被覆盖,则使用自定义函数替换它。
最后,此解决方案假设网页正在执行window.print()函数以启动打印。如果页面使用不同的机制,这个解决方案将不起作用,我们需要进一步检查页面的JavaScript。

相关问题