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

18

我正在开发一款Safari 内容阻止扩展。如果用户禁用了该扩展,我会显示设置说明;反之,如果启用了该扩展,则显示设置。如何确定用户是否启用了该扩展?

我看到过这个方法可以检测自定义键盘是否被激活,但NSUserDefaults中没有与 Safari 内容阻止器相关的密钥。


看起来这个还没有作为公共API暴露出来。如果你在越狱环境下工作,可能会有一个包含此信息的plist或文件在/var/mobile/Media/Safari/目录中。 - JAL
可能是 http://stackoverflow.com/questions/32970259/how-do-i-know-if-my-ios-safari-content-blocker-is-enabled 的重复问题。 - kabiroberai
打破你的.json文件的结构,看看在debugger中是否出现错误。如果有错误 - 一切都正常,你应该将.json恢复到正常状态并继续进行。 - TheLuminor
1
https://www.hackingwithswift.com/safari-content-blocking-ios9 这个链接可能会有所帮助。如有需要,请随时联系我。 - TheLuminor
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
    }
})

嗨兄弟,我打算创建一个基于订阅的应用程序。我想编程实现启用和禁用阻止器,这可行吗? - ikbal
@Rock:您无法通过编程方式更改Safari的内容拦截器设置中的启用/禁用状态。只有用户可以通过“设置”应用程序更改它。 - breakingobstacles

7
您可以使用SFSafariViewController来加载自定义网站。该网站检查是否能够显示应该被您的内容拦截器阻止的内容。然后重定向到您的应用程序之前注册的相应自定义URL(成功/失败)。您甚至可以使用隐藏的Safari View Controller而不带任何动画,以避免从用户角度分散注意力(如此处所示:here)。 (我猜这种技术是由前内容拦截器Peace使用的)。

步骤

应用程序

  1. Register custom URLs for success/failure
  2. Register for notification callback using the NotificationCenter (e.g. contentBlockerEnabled)
  3. 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": ".*"
        }
    }
    

网站

  1. Check for blocked content:

    if($('.blocked_selector').css('display') == "none") {
       // Content blocker enabled
    }
    
  2. Redirect to custom URL (success/failure)

应用程序

  1. application:openURL:options:发送通知 (根据调用的url成功或失败)

更新于18/01

继续Tilo的假设,我建立了所提出的解决方案。我在Medium上写了关于我学到的内容,你可以从GitHub获取源文件

简而言之 它工作,但由于内容阻止规则数据库更新的延迟,它有时会出现问题。一个潜在的解决办法是将测试页面重定向以创建人工延迟。


你如何检查自定义网站上的被阻止内容? - Ryan Brodie
一个可能的解决方案在这里描述(使用jQuery):http://www.hongkiat.com/blog/jquery-detect-ads-block/ - tilo
好的,我整理了答案,看起来非常有前途。今晚我无法验证,但为了赏金,我已将其标记为正确。 - Ryan Brodie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接