我试图构建一个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-beta 4)脚本位于另一个带有扩展名的文件中。
编辑1
经过更多的测试后,这个错误似乎只与在messageDipatch调用中传递“屏幕快照”对象有关。如果我取出屏幕截图,并且只传递selectedText数据,它就会像预期的那样工作。我还尝试将屏幕截图作为画布传递,而不是通过'convertCanvasToImage()‘调用来运行它,但是我也收到了同样的错误。
发布于 2017-03-02 21:35:40
这个问题最终与我在将画布转换为数据url之前如何插入图像数据有关。
从:
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)
https://stackoverflow.com/questions/42540827
复制相似问题