Определите, разрешено ли пользователю приложение Расширение блокировки содержимого Safari
Я работаю над расширением блокировки содержимого Safari. Я намерен показать инструкции по установке, если расширение отключено и отобразить настройки, если он включен. Как определить, включено ли расширение пользователем?
Я видел этот метод, чтобы определить, активирована ли пользовательская клавиатура, но нет ключа на NSUserDefaults
, относящегося к блокировщикам содержимого Safari.
Ответы
Ответ 1
Начиная с iOS 10, в SFContentBlockerManager
существует новый метод для поддержки этого:
getStateOfContentBlocker(withIdentifier:completionHandler:)
И вы называете это так (Swift 3):
SFContentBlockerManager.getStateOfContentBlocker(withIdentifier: "your.identifier.here", completionHandler: { (state, error) in
if let error = error {
// TODO: handle the error
}
if let state = state {
let contentBlockerIsEnabled = state.isEnabled
// TODO: do something with this value
}
})
Ответ 2
Вы можете использовать SFSafariViewController
для загрузки пользовательского веб-сайта. На этом веб-сайте проверяется, может ли он показывать что-то, что блокирует блокировщик содержимого. Затем перенаправляйте на соответствующий пользовательский URL-адрес (успех/сбой), к которому ранее было зарегистрировано ваше приложение. Вы даже можете использовать скрытый Safari View Controller без анимации, чтобы избежать отвлечения от перспективы пользователя (как показано здесь). (Я предполагаю, что этот метод используется бывшим блокатором контента Peace)
Действия
Приложение
- Зарегистрировать настраиваемые URL-адреса для успеха/сбоя
- Зарегистрируйтесь для обратного вызова уведомления с помощью NotificationCenter (например,
contentBlockerEnabled
)
-
Используйте SFSafariViewController
для показа пользовательского веб-сайта и включите следующее правило в blockerList.json
:
{
"action": {
"type": "css-display-none",
"selector": ".blocked_selector"
},
"trigger": {
"url-filter": ".*"
}
}
Сайт
-
Проверить заблокированный контент:
if($('.blocked_selector').css('display') == "none") {
// Content blocker enabled
}
-
Перенаправление на пользовательский URL (успех/сбой)
Приложение
- Сообщение из
application:openURL:options:
(успех/неудача на основе названного url)
Обновление 18/01
Следуя из гипотезы Тило, я построил предлагаемое решение. Я писал о том, что Я узнал на Medium, и вы можете захватить источник файлы из GitHub.
TL; DR Он работает, но только по-разному из-за задержки, вызванной обновлением базы правил блокировки контента. Потенциальное обходное решение перенаправляет тестовую страницу для создания искусственной задержки.