我正在尝试构建Safari扩展以共享网页的屏幕截图,但是当我尝试将图像传回Swift时,我得到一个错误,导致Safari不稳定并在进程中杀死我的任务。
这个想法是当用户点击工具栏按钮时,保存任何选定的文本和网页的屏幕截图。我试图通过userInfo字典传递这两个。如果我按照调用的dispatchMessage调用运行我的代码,我没有看到任何错误。如果我取消注释调度调用,我会看到以下错误:
WebKitSubtleCrypto is deprecated. Please use SubtleCrypto instead.
这是我的js代码:
document.addEventListener("DOMContentLoaded", function(event) {
safari.self.addEventListener("message", handleMessage);
});
function handleMessage(event) {
var selectedText = window.getSelection().toString();
var screenshot;
if (window.top === window) {
html2canvas(document.getElementsByTagName('html')).then(function(canvas) {
screenshot = convertCanvasToImage(canvas);
console.log("canvas image: " + screenshot)
safari.extension.dispatchMessage("test", {"selectedText": selectedText, "screenshot" : canvas});
});
}
}
function convertCanvasToImage(canvas) {
var image = new Image();
image.src = canvas.toDataURL("image/png");
return image;
}
html2canvas(最新版本 - 0.5.0-beta4)脚本位于包含扩展名的另一个文件中。
修改1
经过一些更多的测试后,看起来这个错误只与在messageDipatch调用中传递'screenshot'对象有关。如果我取出截图并仅传递selectedText数据,它将按预期工作。我还尝试将屏幕截图作为画布传递,而不是通过'convertCanvasToImage()'调用运行它,但我得到了相同的错误。
答案 0 :(得分:0)
这个问题最终与我在将画布转换为数据网址之前初始化图像数据有关。
来自:
function convertCanvasToImage(canvas) {
var image = new Image();
image.src = canvas.toDataURL("image/png");
return image;
}
为:
function convertCanvasToImage(canvas) {
var imageData = canvas.toDataURL("image/png")
return imageData;
}
解决了这个问题。
在Swift方面,这是我解码数据的方式(谨慎对待所有强制):
let imageString = userInfo?["screenshot"] as! String
let imageData = NSData.init(contentsOf: NSURL(string: imageString) as! URL)
let image = NSImage(data: imageData as! Data)