18

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

我见过这种方法来检测是否激活了自定义键盘,但没有NSUserDefaults与 Safari 内容拦截器相关的键。

4

2 回答 2

9

从 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
    }
})
于 2016-10-04T00:43:31.587 回答
7

您可以使用 aSFSafariViewController来加载自定义网站。该网站检查它是否能够显示您的内容阻止程序应阻止的内容。然后重定向到您的应用之前注册的相应自定义 URL(成功/失败)。您甚至可以使用不带动画的隐藏 Safari 视图控制器来避免从用户的角度分心(如此处所示。(我猜这种技术是由前内容拦截器Peace使用的)

脚步

应用程序

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

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

网站

  1. 检查被阻止的内容

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

应用程序

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

更新 18/01

根据Tilo 的假设,我构建了建议的解决方案。我写了我在 Medium 上学到的东西,你可以从 GitHub 获取源文件

TL;DR它可以工作,但只是暂时的,因为内容阻止规则数据库更新时会产生延迟。一个潜在的解决方法是重定向测试页面以创建人为延迟。

于 2015-11-10T08:55:40.337 回答