我正在开发Safari Content Blocking 扩展。如果扩展被禁用,我打算显示设置说明,如果相反启用,我打算显示设置。如何确定用户是否启用了扩展程序?
我见过这种方法来检测是否激活了自定义键盘,但没有NSUserDefaults
与 Safari 内容拦截器相关的键。
我正在开发Safari Content Blocking 扩展。如果扩展被禁用,我打算显示设置说明,如果相反启用,我打算显示设置。如何确定用户是否启用了扩展程序?
我见过这种方法来检测是否激活了自定义键盘,但没有NSUserDefaults
与 Safari 内容拦截器相关的键。
从 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
}
})
您可以使用 aSFSafariViewController
来加载自定义网站。该网站检查它是否能够显示您的内容阻止程序应阻止的内容。然后重定向到您的应用之前注册的相应自定义 URL(成功/失败)。您甚至可以使用不带动画的隐藏 Safari 视图控制器来避免从用户的角度分心(如此处所示)。(我猜这种技术是由前内容拦截器Peace使用的)
contentBlockerEnabled
)用于SFSafariViewController
显示自定义网站并在 中包含以下规则blockerList.json
:
{
"action": {
"type": "css-display-none",
"selector": ".blocked_selector"
},
"trigger": {
"url-filter": ".*"
}
}
if($('.blocked_selector').css('display') == "none") {
// Content blocker enabled
}
重定向到自定义 URL(成功/失败)
application:openURL:options:
从(基于调用的 url 的成功/失败)发布通知
根据Tilo 的假设,我构建了建议的解决方案。我写了我在 Medium 上学到的东西,你可以从 GitHub 获取源文件。
TL;DR它可以工作,但只是暂时的,因为内容阻止规则数据库更新时会产生延迟。一个潜在的解决方法是重定向测试页面以创建人为延迟。