我正在研究Safari Content Blocking extension。我打算在禁用扩展时显示设置说明,如果反向启用则显示设置。如何确定用户是否启用了扩展程序?
我看到this method检测自定义键盘是否已激活,但NSUserDefaults
上没有与Safari内容拦截器相关的键。
答案 0 :(得分:6)
您可以使用SFSafariViewController
加载自定义网站。该网站检查是否能够显示您的内容拦截器应阻止的内容。然后重定向到您的应用之前注册的相应自定义网址(成功/失败)。您甚至可以在没有动画的情况下使用隐藏的Safari视图控制器,以避免从用户的角度分散注意力(如图here所示)。 (我猜这种技术被以前的内容拦截器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
}
重定向到自定义网址(成功/失败)
application:openURL:options:
(基于被叫网址的成功/失败)继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
}
})