更新 Safari 应用程序扩展内容阻止程序列表

Posted

技术标签:

【中文标题】更新 Safari 应用程序扩展内容阻止程序列表【英文标题】:Update Safari App Extension Content Blocker list 【发布时间】:2019-03-01 05:26:34 【问题描述】:

从 Safari 应用扩展创建原生内容拦截器时,如何在插件加载后更新静态 JSON 列表?

我现在能看到的唯一方法是部署一个不会为用户自动更新的全新版本的应用程序。

是否可以从另一个 URL 更新内容阻止程序的 JSON 阻止列表文件,而无需通过 Apple 商店更新 Safari 应用程序扩展?

【问题讨论】:

【参考方案1】:

您可以更新 JSON 阻止列表

第 1 步:

为内容阻止规则创建新的 JSON

第 2 步: 将 JSON 文件保存在共享容器中

fileprivate func saveRuleFile(ruleList:[Rule]) 
        let encoder = JSONEncoder()
        if let encoded = try? encoder.encode(ruleList) 

            let sharedContainerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.xxx.xxxx.xxx")
            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)
                
            
        
    

第 3 步:调用此方法要求内容拦截器重新加载规则

SFContentBlockerManager.reloadContentBlocker(withIdentifier:"com.xxxx.xxx.xxxx", completionHandler: nil)

步骤:4 从共享容器中读取 JSON 规则文件并将规则传递给内容拦截器扩展

func beginRequest(with context: NSExtensionContext) 
        let sharedContainerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.xxx.xxx.xxx")
        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)
    

【讨论】:

每个请求都会调用 beginRequest 吗?还是仅在 Safari 引导期间?我正在尝试从服务器获取是否允许域,然后阻止或允许请求。我知道这很慢,但我现在只是在测试一些东西。 不,beginsRequest 没有被每个请求调用,它只会在你调用 FContentBlockerManager.reloadContentBlocker(withIdentifier:"com.xxxx.xxx.xxxx", completionHandler: nil) 时被调用跨度> 跟随代码,对我来说它适用于阻塞,但在解除阻塞时不起作用。 JFYI,我从 json 中删除触发器/动作块以停用过滤器。

以上是关于更新 Safari 应用程序扩展内容阻止程序列表的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:如何将内容阻止程序应用于 chrome?

从应用程序内停用 iOS 9 Safari 内容阻止?

具有可更新订阅的 iOS 内容块扩展

到达下拉列表时单击iphone移动箭头键,应显示下拉列表内容

CORS 仅在 Firefox 和 Safari 上且仅在 onClick() 上阻止内容

苹果手机怎么阻止弹出网页?