ios cocoa nsuserdefaults safari-content-blocker

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

  1. Registrar URL personalizadas para el éxito / fracaso
  2. Regístrese para contentBlockerEnabled devolución de llamada mediante NotificationCenter (por ejemplo, contentBlockerEnabled )
  3. Use SFSafariViewController para mostrar un sitio web personalizado e incluya la siguiente regla en blockerList.json :

    { "action": { "type": "css-display-none", "selector": ".blocked_selector" }, "trigger": { "url-filter": ".*" } }

Sitio web

  1. Compruebe si hay contenido bloqueado :

    if($(''.blocked_selector'').css(''display'') == "none") { // Content blocker enabled }

  2. Redirigir a URL personalizada (éxito / fracaso)

Aplicación

  1. 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.