我目前正在开发一个阻止内容的 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
}
感谢您的帮助