我有一个带有多个内容拦截器扩展的应用程序。他们的配置很好,他们按照他们应该的方式行事。
reloadContentBlocker(withIdentifier:completionHandler:)
但是,例如,SFContentBlockerManager
当我更新过滤器列表时,我需要打电话。
这是一个代码示例(下面使用 NSLog 用于时间戳):
func reload(_ callback: @escaping((Bool) -> Void)) {
NSLog("Reload start")
let contentBlockersIdentifiers = ["com.aaa.bbb.ContentBlocker.ExampleA", "com.aaa.bbb.ContentBlocker.ExampleB", "com.aaa.bbb.ContentBlocker.ExampleC", "com.aaa.bbb.ContentBlocker.ExampleD", "com.aaa.bbb.ContentBlocker.ExampleE"]
var failures: [String] = [String]()
let dispatchSemaphore = DispatchSemaphore(value: 0)
let dispatchQueue = DispatchQueue(label: "reload-queue", qos: .userInitiated)
dispatchQueue.async {
NSLog("Reloading content blockers")
for aContentBlockerIdentifier in contentBlockersIdentifiers {
NSLog("Reloading '\(aContentBlockerIdentifier)'")
SFContentBlockerManager.reloadContentBlocker(withIdentifier: aContentBlockerIdentifier) { (error) in
if let error = error?.localizedDescription {
NSLog("Failed to reload '\(aContentBlockerIdentifier)': \(error)")
failures.append(aContentBlockerIdentifier)
} else {
NSLog("Successfully reloaded '\(aContentBlockerIdentifier)'")
}
dispatchSemaphore.signal()
}
dispatchSemaphore.wait()
}
callback(failures.isEmpty)
NSLog("Reload end")
}
}
这就是印刷品:
16:41:43.391543+0200重新加载开始
16:41:43.392003+0200重新加载内容拦截器
16:41:43.392125+0200重新加载 'com.aaa.bbb.ContentBlocker.ExampleA'
16:41:50.010102+0200成功重新加载 'com. aaa.bbb.ContentBlocker.ExampleA'
16:41:50.010299+0200重新加载 'com.aaa.bbb.ContentBlocker.ExampleB'
16:41:50.351554+0200无法重新加载 'com.aaa.bbb.ContentBlocker.ExampleB':操作无法完成。(WKErrorDomain 错误 2。)
16:41:50.351676+0200重新加载 'com.aaa.bbb.ContentBlocker.ExampleC'
16:41:50.493327+0200无法重新加载 'com.aaa.bbb.ContentBlocker.ExampleC':操作无法'没有完成。
16:41:50.493429+0200重新加载“com.aaa.bbb.ContentBlocker.ExampleD”
16:41:50.631578+0200无法重新加载“com.aaa.bbb.ContentBlocker.ExampleD”:操作无法完成。(WKErrorDomain 错误 2。)
16:41:50.631681+0200重新加载 'com.aaa.bbb.ContentBlocker.ExampleE'
16:41:50.718466+0200无法重新加载 'com.aaa.bbb.ContentBlocker.ExampleE':操作无法'没有完成。(WKErrorDomain 错误 2。)
16:41:50.718600+0200重新加载结束
它显然试图重新加载一个又一个内容阻止程序(就像我想对DispatchSemaphore
. 然而,在第一个成功之后,以下是失败的。
现在让我们在 Setting App > Safari > Content Blockers 中禁用 Content Blockers,然后再试一次:
16:55:05.699392+0200重新加载开始
16:55:05.700171+0200重新加载内容拦截器
16:55:05.700564+0200重新加载 'com.aaa.bbb.ContentBlocker.ExampleA'
16:55:05.714444+0200成功重新加载 'com. aaa.bbb.ContentBlocker.ExampleB'
16:55:05.714909+0200重新加载 'com.aaa.bbb.ContentBlocker.ExampleB'
16:55:05.723056+0200成功重新加载 'com.aaa.bbb.ContentBlocker.ExampleB'
16:55 :05.723343+0200重新加载'com.aaa.bbb.ContentBlocker.ExampleC'
16:55:05.730565+0200成功重新加载'com.aaa.bbb.ContentBlocker.ExampleC'
16:55:05.730775+0200重新加载'com.aaa.bbb .ContentBlocker.ExampleD'
16:55:05.735733+0200成功重新加载 'com.aaa.bbb.ContentBlocker.ExampleD'
16:55:05.735841+0200重新加载 'com.aaa.bbb.ContentBlocker.ExampleE'
16:55:05.740758+0200成功重新加载 'com.aaa.bbb.ContentBlocker. ExampleE'
16:55:05.740865+0200重新加载结束
惊喜......它的工作原理。但我宁愿不要求我的用户:
- 在设置中手动禁用内容阻止程序
- 手动执行更新(等待开发自动刷新)
- 去手动重新启用设置中的内容阻止程序
我在某处遗漏了一些东西(可能是线程问题)。希望有人能够提供帮助!