确定用户是否已启用应用程序的Safari内容阻止程序扩展

Rya*_*die 16 cocoa nsuserdefaults ios safari-content-blocker

我正在开发Safari Content Blocking扩展程序.我打算在禁用扩展时显示设置说明,如果反向启用则显示设置.如何确定用户是否启用了扩展程序?

我已经看到这种方法来检测自定义键盘是否被激活,但是没有NSUserDefaults与Safari内容拦截器相关的键.

til*_*ilo 6

您可以使用a SFSafariViewController来加载自定义网站.该网站检查是否能够显示您的内容拦截器应阻止的内容.然后重定向到您的应用之前注册的相应自定义网址(成功/失败).你甚至可以使用一个隐藏的Safari浏览器没有动画,以避免从用户的角度来看任何分心(如图所示这里).(我猜这种技术被前内容拦截器和平使用)

脚步

应用

  1. 注册成功/失败的自定义URL
  2. 使用NotificationCenter注册通知回调(例如 contentBlockerEnabled)
  3. 使用SFSafariViewController显示自定义的网站,包括以下规则blockerList.json:

    {
        "action": {
            "type": "css-display-none",
            "selector": ".blocked_selector"
        },
        "trigger": {
            "url-filter": ".*"
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

网站

  1. 检查被阻止的内容:

    if($('.blocked_selector').css('display') == "none") {
       // Content blocker enabled
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 重定向到自定义URL(成功/失败)

应用

  1. 发布通知 application:openURL:options:(基于被叫url的成功/失败)

更新18/01

Tilo的假设之后,我构建了提出的解决方案.我写了关于我在Medium上学到的东西,你可以从GitHub中获取源文件.

TL; DR由于内容阻止规则数据库更新导致的延迟,它只能在气质上工作.一种潜在的解决方法是重定向测试页面以创建人为延迟.


bre*_*les 5

从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
    }
})
Run Code Online (Sandbox Code Playgroud)