Как перезагрузить блокировщики контента, пока они активны? - PullRequest
1 голос
/ 24 апреля 2020

У меня есть приложение с несколькими расширениями контента. Их конфигурация в порядке, и они действуют так, как они должны.

Однако мне нужно позвонить 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 ': операция не может быть завершена. (Ошибка 2 WKErrorDomain.)
16: 41: 50.351676 + 0200 Перезагрузка 'com.aaa.bbb.ContentBlocker.Example C'
16: 41: 50.493327 + 0200 Не удалось перезагрузить com.aaa.bbb.ContentBlocker.Example C ': операция не может быть завершена. (WKErrorDomain ошибка 2.)
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). Однако после первого успешного выполнения следующие ошибки:

Теперь давайте go и отключим блокировщики контента в Настройке приложения> Safari> Блокировщики контента и повторите попытку:

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.Example C'
16: 55: 05.730565 + 0200 Успешно перезагружен com.aaa. bbb.ContentBlocker.Example C '
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. go вручную отключить блокировщики контента в настройках
  2. выполнить обновление вручную (в ожидании разработки автоматического c refre sh)
  3. go вручную повторно включите блокировщики содержимого в настройках

Я что-то упустил (возможно, проблема в теме). Надеюсь, кто-нибудь сможет помочь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...