面临 Safari 扩展的 ContentBlockerRequestHandler 问题

问题描述 投票:0回答:1

我目前正在开发一个阻止内容的 Safari 应用程序扩展。我希望用户配置规则(打开和关闭规则)。由于我无法覆盖捆绑的 JSON 文件,并且我们无法写入文档文件夹,因为扩展无法访问它,所以我决定使用应用程序组。我的方法如下: 在 ContentBlockerRequestHandler 中,我想将 blockerList.json 保存到应用程序组中(仅在第一次启动时) 完成此操作后,我希望处理程序通过获取应用程序组内的 json 的 url 来从应用程序组中读取数据,而不是获取扩展中的默认 json 由于我无法调试处理程序,我不知道我是否走在正确的道路上。下面显示了我的代码:

ContentBlockerRequestHandler 类:NSObject、NSExtensionRequestHandling {

func beginRequest(with context: NSExtensionContext) {
    
    guard let rulesUrl = loadRules() else {
        let clonedRules = cloneBlockerList()
        save(rules: clonedRules)
        return
    }
    
    guard let attachment = NSItemProvider(contentsOf: rulesUrl) else { return }
    
    let item = NSExtensionItem()
    item.attachments = [attachment]
    
    context.completeRequest(returningItems: [item], completionHandler: nil)
}

private func cloneBlockerList() -> [Rule] {
    
    var rules: [Rule] = []
    if let url = Bundle.main.url(forResource: "blockerList", withExtension: "json") {
        do {
            let data = try Data(contentsOf: url)
            let decoder = JSONDecoder()
            let jsonData = try decoder.decode(ResponseData.self, from: data)
            rules = jsonData.rules
        } catch {
            print("error:(error)")
        }
    }
    
    return rules
}

private func save(rules: [Rule]) {
    
    let documentsDirectory = FileManager().containerURL(forSecurityApplicationGroupIdentifier: "my group identifier")
    let archiveURL = documentsDirectory?.appendingPathComponent("rules.json")
    let encoder = JSONEncoder()
    if let dataToSave = try? encoder.encode(rules) {
    do {
        try dataToSave.write(to: archiveURL!)
        } catch {
        // TODO: ("Error: Can't save Counters")
        return;
        }
    }
}

private func loadRules() -> URL? {
    
    let documentFolder = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "my group identifier")
    guard let jsonURL = documentFolder?.appendingPathComponent("rules.json") else {
        return nil
    }
    
    return jsonURL
}

} 感谢您的帮助

swift safari safari-content-blocker
1个回答
0
投票

我尝试使用硬编码解决方案:不使用文件,而是从字符串传输数据。 它奏效了。 在这种情况下,生成所需的字符串即可获得结果。

func beginRequest(with context: NSExtensionContext) {
    let JSON = """
        [
            {
                "action": {
                    "type": "block"
                },
                "trigger": {
                    "url-filter": ".*[.]youtube.com",
                    "resource-type": ["script"]
                }
            }
        ]
    """
    let JSONData = JSON.data(using: .utf8)!
    let attachment = NSItemProvider(item: JSONData as NSSecureCoding?, typeIdentifier: kUTTypeJSON as String)
    let item = NSExtensionItem()
    item.attachments = [attachment]
    context.completeRequest(returningItems: [item], completionHandler: nil)
}

附注这是我根据某个主题修改的想法:https://github.com/confirmedcode/lockdown-ios/blob/master/Lockdown%20Blocker/ContentBlockerRequestHandler.swift

© www.soinside.com 2019 - 2024. All rights reserved.