如何在Safari App Extension中创建本地内容拦截器后,在插件加载后更新静态JSON列表?
目前我所能看到的唯一方法是部署一个全新版本的应用程序,这对用户来说不会自动更新。
是否可以从另一个URL更新内容拦截器的JSON阻止列表文件,而无需通过Apple商店更新Safari App Extension?
如何在Safari App Extension中创建本地内容拦截器后,在插件加载后更新静态JSON列表?
目前我所能看到的唯一方法是部署一个全新版本的应用程序,这对用户来说不会自动更新。
是否可以从另一个URL更新内容拦截器的JSON阻止列表文件,而无需通过Apple商店更新Safari App Extension?
是的,你可以更新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)
}
}
}
}
第三步:调用此方法请求内容阻止器重新加载规则
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)
}