我正在开发一款Safari 内容阻止扩展。如果用户禁用了该扩展,我会显示设置说明;反之,如果启用了该扩展,则显示设置。如何确定用户是否启用了该扩展?
我看到过这个方法可以检测自定义键盘是否被激活,但NSUserDefaults
中没有与 Safari 内容阻止器相关的密钥。
我正在开发一款Safari 内容阻止扩展。如果用户禁用了该扩展,我会显示设置说明;反之,如果启用了该扩展,则显示设置。如何确定用户是否启用了该扩展?
我看到过这个方法可以检测自定义键盘是否被激活,但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
}
})
SFSafariViewController
来加载自定义网站。该网站检查是否能够显示应该被您的内容拦截器阻止的内容。然后重定向到您的应用程序之前注册的相应自定义URL(成功/失败)。您甚至可以使用隐藏的Safari View Controller而不带任何动画,以避免从用户角度分散注意力(如此处所示:here)。 (我猜这种技术是由前内容拦截器Peace使用的)。
contentBlockerEnabled
) Use SFSafariViewController
to show a custom website and include the following rule in blockerList.json
:
{
"action": {
"type": "css-display-none",
"selector": ".blocked_selector"
},
"trigger": {
"url-filter": ".*"
}
}
if($('.blocked_selector').css('display') == "none") {
// Content blocker enabled
}
Redirect to custom URL (success/failure)
application:openURL:options:
发送通知 (根据调用的url成功或失败)继续Tilo的假设,我建立了所提出的解决方案。我在Medium上写了关于我学到的内容,你可以从GitHub获取源文件。
简而言之 它工作,但由于内容阻止规则数据库更新的延迟,它有时会出现问题。一个潜在的解决办法是将测试页面重定向以创建人工延迟。
/var/mobile/Media/Safari/
目录中。 - JAL.json
文件的结构,看看在debugger
中是否出现错误。如果有错误 - 一切都正常,你应该将.json
恢复到正常状态并继续进行。 - TheLuminor