Использование нескольких списков JSON в iOS Content Blocker

Я пытаюсь создать свой собственный блокировщик контента на iOS. Я хотел создать отдельные списки json для разных типов контента (отслеживание, реклама, сайты для взрослых и т. Д.). Я наткнулся на этот https://github.com/calebhicks/ios-safari-content-blocking котором говорилось, что вы можете создать массив "вложений" вместо того, чтобы полагаться на отдельный json-файл blockerList.

func beginRequest(with context: NSExtensionContext) {
    var jsonFiles:Array<NSItemProvider> = Array()

    let attachment = NSItemProvider(contentsOf: Bundle.main.url(forResource: "blockerList", withExtension: "json"))!
    jsonFiles.append(attachment)

    let attachment2 = NSItemProvider(contentsOf: Bundle.main.url(forResource: "testList", withExtension: "json"))!
    jsonFiles.append(attachment2)

    let item = NSExtensionItem()
    item.attachments = jsonFiles

    context.completeRequest(returningItems: [item], completionHandler: nil)
}

Большая часть этого кода используется по умолчанию в настройках Content Blocker Extension, но я добавил массив jsonFiles, в который помещаются attachment и attachment2. При запуске загружается только один из двух наборов правил, но не комбинация два. Любые идеи о том, почему загружается только один набор правил?

1 ответ

Вы можете объединить два файла правил JSON в один файл и использовать этот файл.

    import UIKit
        import MobileCoreServices
        class ContentBlockerRequestHandler: NSObject, NSExtensionRequestHandling {

        func beginRequest(with context: NSExtensionContext) {

        let sharedContainerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "you app group identifier")

                let sourceURLRules = sharedContainerURL?.appendingPathComponent("Rules1.json")
                let sourceURLRules2 = sharedContainerURL?.appendingPathComponent("Rules2.json")
                do {
                    let jsonDecoder = JSONDecoder()

                    let dataFormRules1 = try Data(contentsOf: sourceURLRules1!, options: .mappedIfSafe)// Rule is Decode able Swift class            
                   let  rulesArray1 = try? jsonDecoder.decode(Array<Rule>.self,from: dataFormRules1)

                    let dataFormRules2 = try Data(contentsOf: sourceURLRules2!, options: .mappedIfSafe)
                    let  rulesArray2 = try? jsonDecoder.decode(Array<Rule>.self,from: dataFormRules2)

                    saveCombinedRuleFile(ruleList: rulesArray1! + rulesArray2!)

                } catch {
                    //handle error condition
                }

                let sourceURLCombinedRule = sharedContainerURL?.appendingPathComponent("CombinedRule.json")
                let combinedRuleAttachment = NSItemProvider(contentsOf: sourceURLCombinedRule)
                let item = NSExtensionItem()
                item.attachments = [combinedRuleAttachment]
                context.completeRequest(returningItems: [item], completionHandler: nil)
            }

            func saveCombinedRuleFile(ruleList:[Rule]) {
                let encoder = JSONEncoder()
                if let encoded = try? encoder.encode(ruleList) {
                    let sharedContainerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.slashnext.mobileshield")
                    if let json = String(data: encoded, encoding: .utf8) {
                        print(json)
                    }
                    if let destinationURL = sharedContainerURL?.appendingPathComponent("CombinedRule.json") {
                        do {
                            try  encoded.write(to: destinationURL)
                        } catch {
                            print ("catchtry")
                        }
                    }
                }
            }
        }
Другие вопросы по тегам