如何在 Safari 应用程序扩展中加载本地 HTML 文件

How do I load a local HTML file in a Safari App Extension

我正在编写一个 Safari 应用程序扩展。在我的扩展文件夹中,我有一个 HTML 文件,我想读入该文件并使用 Javascript 将其附加到网页。我不知道如何读取文件。我愿意使用 Javascript 或在 Swift 代码中执行此操作。任何帮助将不胜感激,谢谢!

您可以使用一些 XMLHttpRequest 读取文本或 HTML 文件,如下所示:

var oReq = new XMLHttpRequest();
oReq.addEventListener('load', function () {
  // file contents will be in `this.responseText`;
  console.log(this.responseText);
});
oReq.open('GET', 'myfile.html');
oReq.send();

请注意,此示例中的 URL 是相对的。如果您在全局页面上使用此代码,它将相对于全局页面。如果您在注入的脚本中使用它,它将相对于您注入脚本的网页,这不是您想要的。在这种情况下,您需要使用以扩展名 URL 开头的绝对 URL。要获取基数 URL,请使用 safari.extension.baseURI。这是上面示例的第 6 行,但使用了这样的绝对值 URL:

oReq.open('GET', safari.extension.baseURI + 'myfile.html');

使用 XMLHttpRequest 的一个更 hacky 的替代方法是将 HTML 文件加载到扩展程序全局页面内的 iframe 中,然后从脚本加载 iframed 页面的 "reading" document.body.innerHTML在全局页面上。

我最终弄清楚了如何在 Swift 代码中执行此操作。我只使用 Swift 几天,所以这个示例可能不是很好,但希望它能有所帮助:

// The file path below is relative to the root of the extension directory.
let filename: NSString = "folder/file.html" as NSString
let pathExtention = filename.pathExtension
let pathPrefix = filename.deletingPathExtension

if let filepath = Bundle.main.path(forResource: pathPrefix, ofType: pathExtention) {
    do {
        let contents = try String(contentsOfFile: filepath, encoding: .utf8) 
    } catch {
        // contents could not be loaded
    }
}