Как добавить или удалить правило черного списка содержимого сафари во время выполнения - PullRequest
0 голосов
/ 07 мая 2020

Я использую в своем проекте расширение для блокировки контента сафари. когда я устанавливаю правило в файле blockerList. json статически и запускаю проект, все работает нормально. Теперь я хочу установить свое правило динамически, используя технику c, как описано ниже.

Ребята, помогите мне установить правило динамически во время выполнения.

Я пробую это, но получаю сообщение об ошибке, когда

  1. загружается из класса viewcontroller
fileprivate func saveRuleFile() {

        let ruleList = [["trigger":["url-filter": ".*"],"action":["type": "block"]]]

        let encoder = JSONEncoder()
        encoder.outputFormatting = .prettyPrinted
        if let encoded = try? encoder.encode(ruleList) {

            let sharedContainerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.****.***")
            print("sharedContainerURL = \(String(describing: sharedContainerURL))")

            if let json = String(data: encoded, encoding: .utf8) {
                print(json)
            }

            if let destinationURL = sharedContainerURL?.appendingPathComponent("Rules.json") {
                do {
                    try  encoded.write(to: destinationURL)
                } catch {
                    print (error)
                }
            }
        }
    }
И напишите это в классе ContentBlockerRequestHandler
func beginRequest(with context: NSExtensionContext) {
 let sharedContainerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.****.***")
        let sourceURL = sharedContainerURL?.appendingPathComponent("Rules.json")
        let ruleAttachment = NSItemProvider(contentsOf: sourceURL)
        let item = NSExtensionItem()
        item.attachments = ([ruleAttachment] as! [NSItemProvider])
        context.completeRequest(returningItems: [item], completionHandler: nil)
    }
Я пытаюсь загрузить, используя
SFContentBlockerManager.reloadContentBlocker(withIdentifier: "com.app.*****", completionHandler: {(error) in
            if error != nil{
                print("error: \(error.debugDescription)")
            }
        })

, когда пытаюсь выполнить блок третьего номера во время выполнения, я получаю сообщение об ошибке. Но я go к пути к файлу и проверил, что json абсолютно нормально, его действительный json там.

Error Domain=WKErrorDomain Code=2 "(null)" UserInfo={NSHelpAnchor=Rule list compilation failed: Failed to parse the JSON String.}

1 Ответ

0 голосов
/ 11 мая 2020

Попробуйте использовать JSONSerialization. У меня отлично работает :)

fileprivate func saveRuleFile() {

    let ruleList = [["trigger":["url-filter": ".*"],"action":["type": "block"]]]

    let jsonAsData = try! JSONSerialization.data(withJSONObject: ruleList)

    let sharedContainerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.****.***")
    print("sharedContainerURL = \(String(describing: sharedContainerURL))")

    if let destinationURL = sharedContainerURL?.appendingPathComponent("Rules.json") {
        do {
            try  jsonAsData.write(to: destinationURL)
        } catch {
            print (error)
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...