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并单击显示打印页选项的相同按钮。
的
1条答案
按热度按时间rggaifut1#
抱歉之前误会你了
所以,我们需要一个变通办法。我们将使用
WKUserScript
的JavaScript注入来捕获WKWebView
中的window.print()
函数调用。这是可能的,因为Swift与WKWebView
中的JavaScript具有互操作性。现在,让我们剖析代码:
1.**创建打印脚本:**我们使用JavaScript代码片段构造
WKUserScript
对象,该代码片段重新定义了window.print()
函数。在我们的版本中,它使用WebKit消息处理程序window.webkit.messageHandlers.printHandler.postMessage('print')
发送消息。字符串
1.**注入脚本:**我们需要通过
WKWebView
的配置将此脚本注入到WKWebView
中,其中包含一个用户内容控制器。我们还为'printHandler'添加了一个消息处理程序,它将捕获我们在JavaScript中设置的消息。型
1.**设置WKWebView:**现在,使用配置初始化
WKWebView
。但是,由于WebView被分配给弱属性,导致其立即释放,因此会出现早期警告。因此,我们将利用故事板中已经设置好的WKWebView
,它由ARC管理。1.**URL加载:**这里我们照常加载URL。
1.处理脚本消息:
WKScriptMessageHandler
协议实现帮助我们处理打印消息的接收。当我们收到“printHandler”消息时,我们调用一个本机函数printPage()
。型
1.打印功能:
printPage()
功能中,我们使用UIPrintInteractionController
来呈现系统打印对话框。型
这个解决方案在某种程度上是网页的JavaScript环境和我们的本机代码之间的桥梁。
现在,如果
window.print()
函数没有按预期被调用,你应该检查网页上运行的JavaScript代码。window.print()
函数可能是在页面加载之后定义的,覆盖了您的自定义函数。您可以使用轮询来一致地检查window.print()
函数的定义,如果它被覆盖,则使用自定义函数替换它。最后,此解决方案假设网页正在执行
window.print()
函数以启动打印。如果页面使用不同的机制,这个解决方案将不起作用,我们需要进一步检查页面的JavaScript。