Safari内容阻止Swift的多个过滤器

时间:2015-10-01 00:17:53

标签: json swift safari-content-blocker

我正在构建一个简单的内容块应用程序。 它有效,但我想用UISwitches(保存到NSUserDefaults)应用过滤器(哪些网络要阻止,哪些不受阻)。 因为内容阻止扩展使用了json,所以我不清楚如何选择多个json文件同时运行。

任何想法如何实现?多个扩展?以某种方式组合和拆分json文件?

1 个答案:

答案 0 :(得分:1)

我一直处于同样的境地。回答这个问题有点棘手,所以请耐心等待。你不能用bundle写文件,blockerList.json是不可写的。这是你需要做的,

  1. TARGETS - > YOUR MAIN APP启用应用群组 - > Capabilities - > App Groups。并为应用组添加唯一标识符。对扩展做同样的事情。 (使用您为主应用程序输入的组名称相同的标识符)
  2. 在Container目录中创建一个文件。
  3. 将规则(json)写入该文件。
  4. 一旦您有书面规则,就重新加载。
  5. 从内容拦截器扩展程序中的Container目录中读取规则。
  6. 从主应用创建文件并将json规则写入该文件:

    let jsonData = try! JSONSerialization.data(withJSONObject: webFilters, options: JSONSerialization.WritingOptions.prettyPrinted)
    
    //Convert back to string. Usually only do this for debugging
    
    if let JSONString = String(data: jsonData, encoding: String.Encoding.utf8) {
    
                            let file = "conbo.json"
    
    
                            if let dir = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "YOUR_GROUP_IDENTIFIER") {
    
                                let path     = dir.appendingPathComponent(file)
    
                                do {
    
                                    try JSONString.write(to: path, atomically: false, encoding: String.Encoding.utf8)
    
                                    let id = "YOUR_CONTENT_BLOCKER_BUNDLE_IDENTIFIER"
                                    SFContentBlockerManager.reloadContentBlocker(withIdentifier: id) {error in
    
    
    
                                        guard error == nil else {
                                            print(error ?? "Error")
                                            return
                                        }
    
                                        print("Reloaded")
                                    }
    
                                }
                                catch {
                                }
                            }
    
    
                        }
    

    现在在容器中的扩展读取文件中:

    class ContentBlockerRequestHandler: NSObject, NSExtensionRequestHandling {
    
    func beginRequest(with context: NSExtensionContext) {
    
        let file = "conbo.json"
    
    
        if let dir = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "YOUR_APP_GROUP_IDENTIFIER") {
    
            let path     = dir.appendingPathComponent(file)
    
            do {
    
    
    
                do {
                    let attachment =  NSItemProvider(contentsOf: path)!
    
                    let item = NSExtensionItem()
                    item.attachments = [attachment]
    
                    context.completeRequest(returningItems: [item], completionHandler: nil)
    
    
                } 
    
    
    
            }
    
        }
    
    
    
    }
    
    
    
    }