3

从 Safari 应用程序扩展创建本机内容阻止程序时,如何在插件加载后更新静态 JSON 列表?

我现在能看到的唯一方法是部署一个不会为用户自动更新的全新版本的应用程序。

是否可以从另一个 URL 更新内容阻止程序的 JSON 阻止列表文件,而无需通过 Apple 商店更新 Safari 应用程序扩展?

4

1 回答 1

1

的,您可以更新 JSON 阻止列表

步骤1:

为内容阻止规则创建新 JSON

第 2 步: 将 JSON 文件保存在共享容器中

fileprivate func saveRuleFile(ruleList:[Rule]) {
        let encoder = JSONEncoder()
        if let encoded = try? encoder.encode(ruleList) {

            let sharedContainerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.xxx.xxxx.xxx")
            print("sharedContainerURL = \(String(describing: sharedContainerURL))")

            if let json = String(data: encoded, encoding: .utf8) {
                print(json)
            }

            if let destinationURL = sharedContainerURL?.appendingPathComponent("Rules.json") {
                do {
                    try  encoded.write(to: destinationURL)
                } catch {
                    print (error)
                }
            }
        }
    }

第 3 步:调用此方法要求内容拦截器重新加载规则

SFContentBlockerManager.reloadContentBlocker(withIdentifier:"com.xxxx.xxx.xxxx", completionHandler: nil)

步骤:4 从共享容器中读取 JSON 规则文件并将规则传递给内容阻止程序扩展

func beginRequest(with context: NSExtensionContext) {
        let sharedContainerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.xxx.xxx.xxx")
        let sourceURL = sharedContainerURL?.appendingPathComponent("Rules.json")
        let ruleAttachment = NSItemProvider(contentsOf: sourceURL)
        let item = NSExtensionItem()
        item.attachments = ([ruleAttachment] as! [NSItemProvider])
        context.completeRequest(returningItems: [item], completionHandler: nil)
    }
于 2019-07-09T09:35:55.933 回答