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

我正在处理Safari内容阻塞扩展 。 如果扩展function被禁用,我打算显示设置说明,如果反向启用则显示设置。 如何确定用户是否启用了扩展?

我已经看到这种方法来检测自定义键盘是否被激活,但NSUserDefaults没有与Safari Content Blockers相关的键。

从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 } }) 

您可以利用SFSafariViewController加载自定义网站。 本网站检查是否能够显示您的内容拦截器应阻止的内容。 然后redirect到您的应用程序先前注册的相应自定义url(成功/失败)。 您甚至可以使用隐藏的Safari视图控制器而不使用animation来避免从用户的angular度分心(如此处所示)。 (我猜这个技术是被前内容拦截器和平使用的 )

脚步

应用

  1. 注册成功/失败的自定义URL
  2. 使用NotificationCenter注册通知callback(例如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. redirect到自定义URL(成功/失败)

应用

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

18/01更新

继Tilo的假设之后 ,我提出了build议的解决scheme。 我写了我在Medium上学到的东西,并且可以从GitHub获取源文件 。

TL; DR它工作,但只有脾气,由于内容阻塞规则数据库更新所产生的延迟。 潜在的解决方法是redirecttesting页面以创build人工延迟。