8

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

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

4

1 回答 1

4

我一直处于同样的情况。回答这个有点棘手,所以请耐心等待。您不能写入捆绑包中的文件,即blockerList.json不可写入。这是你需要做的,

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

从您的主应用程序创建文件并将 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)


            } 



        }

    }



}



}
于 2017-05-09T08:53:15.840 回答