我正在构建一个简单的内容阻止应用程序。UISwitches
它有效,但我想使用(保存到)应用过滤器(阻止哪些网站,哪些不阻止NSUserDefaults
)。因为内容阻止扩展使用 json,所以我不清楚如何选择多个 json 文件同时运行。
任何想法如何实现?多个扩展?以某种方式组合和拆分json文件?
我正在构建一个简单的内容阻止应用程序。UISwitches
它有效,但我想使用(保存到)应用过滤器(阻止哪些网站,哪些不阻止NSUserDefaults
)。因为内容阻止扩展使用 json,所以我不清楚如何选择多个 json 文件同时运行。
任何想法如何实现?多个扩展?以某种方式组合和拆分json文件?
我一直处于同样的情况。回答这个有点棘手,所以请耐心等待。您不能写入捆绑包中的文件,即blockerList.json
不可写入。这是你需要做的,
TARGETS
从-> YOUR MAIN APP
-> Capabilities
->启用应用程序组App Groups
。并为应用组添加唯一标识符。对扩展做同样的事情。(使用与您为主应用程序输入的组名相同的标识符)从您的主应用程序创建文件并将 json 规则写入该文件,如下所示:
let jsonData = try! JSONSerialization.data(withJSONObject: webFilters, options: JSONSerialization.WritingOptions.prettyPrinted)
//Convert back to string. Usually only do this for debugging
if let JSONString = String(data: jsonData, encoding: String.Encoding.utf8) {
let file = "conbo.json"
if let dir = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "YOUR_GROUP_IDENTIFIER") {
let path = dir.appendingPathComponent(file)
do {
try JSONString.write(to: path, atomically: false, encoding: String.Encoding.utf8)
let id = "YOUR_CONTENT_BLOCKER_BUNDLE_IDENTIFIER"
SFContentBlockerManager.reloadContentBlocker(withIdentifier: id) {error in
guard error == nil else {
print(error ?? "Error")
return
}
print("Reloaded")
}
}
catch {
}
}
}
现在在扩展从容器中读取文件为:
class ContentBlockerRequestHandler: NSObject, NSExtensionRequestHandling {
func beginRequest(with context: NSExtensionContext) {
let file = "conbo.json"
if let dir = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "YOUR_APP_GROUP_IDENTIFIER") {
let path = dir.appendingPathComponent(file)
do {
do {
let attachment = NSItemProvider(contentsOf: path)!
let item = NSExtensionItem()
item.attachments = [attachment]
context.completeRequest(returningItems: [item], completionHandler: nil)
}
}
}
}
}