2

我有一个带有多个内容拦截器扩展的应用程序。他们的配置很好,他们按照他们应该的方式行事。

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重新加载结束

惊喜......它的工作原理。但我宁愿不要求我的用户:

  1. 在设置中手动禁用内容阻止程序
  2. 手动执行更新(等待开发自动刷新)
  3. 去手动重新启用设置中的内容阻止程序

我在某处遗漏了一些东西(可能是线程问题)。希望有人能够提供帮助!

4

1 回答 1

0

最有可能的是,这意味着您的规则包含不正确的语法或规则文件有超过 50 000 条规则。context.completeRequest(returningItems: nil, completionHandler: nil)当您在NSExtensionRequestHandlingwhere 上下文中用 nil 填充返回项目时,也会发生错误NSExtensionContext

于 2020-05-11T09:11:13.263 回答