在 iOS 中重新加载内容拦截器

Reloading Content Blockers in iOS

我听说 iOS 支持内容拦截器,并且所有拦截都是由 App Bundle 中名为 blockerList.json 的文件完成的。虽然我知道 SFContentBlockerManager.reloadContentBlockerWithIdentifier() 会重新加载 blockerList.json 中的数据。但是,我认为这没有任何用处; blockerList.json 是主包的一部分,无法修改。因此,有什么方法可以修改 blockerList.json(或者扩展名可以指向另一个文件,删除并重新创建,不使用 JSON,等等)?

您不必使用捆绑包中的 blockerList.json 作为 JSON 来源。您可以执行多种不同的操作来动态更改内容拦截器。

  1. 您可以让扩展程序从服务器下载新的 JSON 文件,并在应用程序触发时更新拦截器
  2. 将应用程序和内容拦截器扩展程序放在同一个应用程序组中,以便可以在两者之间传递数据,然后执行以下操作之一:
    • 让应用 create/modify 在共享组目录中有一个 JSON 文件,该文件将由扩展程序读取
    • 让应用程序将数据写入共享组用户默认值,然后让扩展程序创建一个 JSON 文件供其加载

是的,我已经通过从主捆绑 json 文件中读取所有阻止规则并在 App Group 标识符容器中创建了一个 json 文件(即 SharedJsonFile.json)来完成此操作。然后我把所有规则写到SharedJsonFile.json.

    [[NSFileManager defaultManager] 
containerURLForSecurityApplicationGroupIdentifier:YOUR_APP_GROUP_IDENTIFIER] 
                   URLByAppendingPathComponent:@"SharedJsonFile.json"]

因此,每当我想进行修改并更新 SharedJsonFile.json,然后重新加载 contentblocker。 为了阅读 json,我在扩展的 beginRequestWithExtensionContext 方法中使用了这个 URL 路径 -

NSURL *jsonPath = [[NSFileManager defaultManager] 
containerURLForSecurityApplicationGroupIdentifier:YOUR_APP_GROUP_IDENTIFIER]
URLByAppendingPathComponent:@"SharedJsonFile.json"];