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

时间:2015-10-31 14:54:10

标签: ios cocoa nsuserdefaults safari-content-blocker

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

我看到this method检测自定义键盘是否已激活,但NSUserDefaults上没有与Safari内容拦截器相关的键。

2 个答案:

答案 0 :(得分:6)

您可以使用SFSafariViewController加载自定义网站。该网站检查是否能够显示您的内容拦截器应阻止的内容。然后重定向到您的应用之前注册的相应自定义网址(成功/失败)。您甚至可以在没有动画的情况下使用隐藏的Safari视图控制器,以避免从用户的角度分散注意力(如图here所示)。 (我猜这种技术被以前的内容拦截器Peace使用)

步骤

应用

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

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

    1. Check for blocked content

      if($('.blocked_selector').css('display') == "none") {
         // Content blocker enabled
      }
      
    2. 重定向到自定义网址(成功/失败)

    3. 应用

      1. 发布通知 application:openURL:options:(基于被叫网址的成功/失败)
      2. 更新18/01

        Tilo's hypothesis之后,我构建了提议的解决方案。我写过关于I learnt on Medium的内容,你可以抓住the source files from GitHub

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

答案 1 :(得分: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
    }
})