ios - Determine si el usuario ha habilitado la extensión del bloqueador de contenido Safari de la aplicación
cocoa nsuserdefaults (2)
A partir de iOS 10, hay un nuevo método en SFContentBlockerManager
para admitir esto:
getStateOfContentBlocker(withIdentifier:completionHandler:)
Y lo llamas así (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
}
})
Estoy trabajando en una extensión de bloqueo de contenido de Safari . Tengo la intención de mostrar las instrucciones de configuración si la extensión está deshabilitada y mostrar la configuración si está habilitada a la inversa. ¿Cómo puedo determinar si la extensión está habilitada por el usuario?
He visto este método para detectar si un teclado personalizado está activado pero no hay una clave en NSUserDefaults
que se relacione con los Bloqueadores de contenido de Safari.
Puede utilizar un SFSafariViewController
para cargar un sitio web personalizado. Este sitio web verifica si es capaz de mostrar algo que su bloqueador de contenido debe bloquear. Luego, redirija a la URL personalizada respectiva (éxito / fracaso) para la cual su aplicación se registró anteriormente. Incluso podría usar un controlador de vista Safari oculto sin animación para evitar cualquier distracción de la perspectiva del usuario (como se muestra here ). (Supongo que esta técnica es utilizada por el antiguo bloqueador de contenido Peace )
Pasos
Aplicación
- Registrar URL personalizadas para el éxito / fracaso
- Regístrese para
contentBlockerEnabled
devolución de llamada mediante NotificationCenter (por ejemplo,contentBlockerEnabled
) Use
SFSafariViewController
para mostrar un sitio web personalizado e incluya la siguiente regla enblockerList.json
:{ "action": { "type": "css-display-none", "selector": ".blocked_selector" }, "trigger": { "url-filter": ".*" } }
Sitio web
Compruebe si hay contenido bloqueado :
if($(''.blocked_selector'').css(''display'') == "none") { // Content blocker enabled }
Redirigir a URL personalizada (éxito / fracaso)
Aplicación
- Publicar notificación desde la
application:openURL:options:
(éxito / fracaso basado en la url llamada)
Actualización 18/01
Siguiendo la hipótesis de Tilo , construí la solución propuesta. Escribí sobre lo que aprendí en Medio y puedes obtener los archivos de origen de GitHub .
TL; DR Funciona pero solo temperamentalmente debido a la latencia incurrida en la base de datos de reglas de bloqueo de contenido para actualizar. Una posible solución es redirigir la página de prueba para crear un retraso artificial.