У меня есть приложение с несколькими расширениями контента. Их конфигурация в порядке, и они действуют так, как они должны.
Однако мне нужно позвонить 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 Перезагрузить конец
Сюрприз ... это работает. Но я бы не стал просить моих пользователей:
- go вручную отключить блокировщики контента в настройках
- выполнить обновление вручную (в ожидании разработки автоматического c refre sh)
- go вручную повторно включите блокировщики содержимого в настройках
Я что-то упустил (возможно, проблема в теме). Надеюсь, кто-нибудь сможет помочь!