2

我目前正在开发一个阻止内容的 Safari 应用程序扩展。我希望用户配置规则(打开和关闭规则)。由于我无法覆盖捆绑的 JSON 文件,也无法写入文档文件夹,因为扩展程序无法访问它,所以我决定使用 App Groups。我的方法如下所示: 在 ContentBlockerRequestHandler 中,我想将 blockerList.json 保存到应用程序组中(仅在第一次启动时)完成此操作后,我希望处理程序通过获取我的 url 从应用程序组中读取json 在应用程序组中,而不是在扩展中采用默认 json 因为我无法调试处理程序,所以我不知道我是否在正确的路径上。下面显示了我的代码:

类 ContentBlockerRequestHandler: NSObject, NSExtensionRequestHandling {

func beginRequest(with context: NSExtensionContext) {
    
    guard let rulesUrl = loadRules() else {
        let clonedRules = cloneBlockerList()
        save(rules: clonedRules)
        return
    }
    
    guard let attachment = NSItemProvider(contentsOf: rulesUrl) else { return }
    
    let item = NSExtensionItem()
    item.attachments = [attachment]
    
    context.completeRequest(returningItems: [item], completionHandler: nil)
}

private func cloneBlockerList() -> [Rule] {
    
    var rules: [Rule] = []
    if let url = Bundle.main.url(forResource: "blockerList", withExtension: "json") {
        do {
            let data = try Data(contentsOf: url)
            let decoder = JSONDecoder()
            let jsonData = try decoder.decode(ResponseData.self, from: data)
            rules = jsonData.rules
        } catch {
            print("error:(error)")
        }
    }
    
    return rules
}

private func save(rules: [Rule]) {
    
    let documentsDirectory = FileManager().containerURL(forSecurityApplicationGroupIdentifier: "my group identifier")
    let archiveURL = documentsDirectory?.appendingPathComponent("rules.json")
    let encoder = JSONEncoder()
    if let dataToSave = try? encoder.encode(rules) {
    do {
        try dataToSave.write(to: archiveURL!)
        } catch {
        // TODO: ("Error: Can't save Counters")
        return;
        }
    }
}

private func loadRules() -> URL? {
    
    let documentFolder = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "my group identifier")
    guard let jsonURL = documentFolder?.appendingPathComponent("rules.json") else {
        return nil
    }
    
    return jsonURL
}

感谢您的帮助

4

0 回答 0