Mac版Safari内容拦截器无法解析iOS兼容JSON 求排查
macOS Sonoma 14.6 下Safari内容拦截扩展无法工作,报JSON解析错误
我开发了一款Safari内容拦截扩展,在iOS 17.5模拟器上运行正常,但在macOS Sonoma 14.6中完全无法工作。这类扩展的构建设置较多,很难制作最小复现示例,以下是相关代码和报错信息。
报错信息
macOS端报错:
Error Domain=WKErrorDomain Code=6 "(null)" UserInfo={NSHelpAnchor=Rule list parsing failed: Failed to parse the JSON String.}
内容拦截器代码
import Foundation class ContentBlockerRequestHandler: NSObject, NSExtensionRequestHandling { func beginRequest(with context: NSExtensionContext) { let attachment = NSItemProvider(object: String( """ [ { "trigger": { "url-filter": "facebook.com" }, "action": { "type": "block" } } ] """ ) as NSString) let item = NSExtensionItem() item.attachments = [attachment] context.completeRequest(returningItems: [item], completionHandler: nil) } }
主应用代码
import SwiftUI import SafariServices @main struct MyApp: App { let contentBlockerIdentifier = Bundle.main.bundleIdentifier! + ".ContentBlocker" init() { SFContentBlockerManager.reloadContentBlocker(withIdentifier: contentBlockerIdentifier, completionHandler: { (error) in if let error = error { print(error) // the error is printed here } }) } var body: some Scene { WindowGroup { Text("Hello") } } }
问题原因及修复方案
报错核心是内容拦截规则的JSON格式不合法。你代码中使用了HTML转义的"代替标准英文双引号",macOS端的内容拦截规则解析器对JSON格式要求严格,因此触发解析失败(iOS端解析可能存在一定容错性)。
修复只需将代码中所有"替换为英文双引号",同时确保JSON结构完整(比如逗号、括号闭合正确)。修复后的内容拦截器代码如下:
import Foundation class ContentBlockerRequestHandler: NSObject, NSExtensionRequestHandling { func beginRequest(with context: NSExtensionContext) { let jsonString = """ [ { "trigger": { "url-filter": "facebook.com" }, "action": { "type": "block" } } ] """ let attachment = NSItemProvider(object: jsonString as NSString) let item = NSExtensionItem() item.attachments = [attachment] context.completeRequest(returningItems: [item], completionHandler: nil) } }
另外,主应用代码中的".ContentBlocker"也需要替换为.ContentBlocker,确保扩展标识符拼接正确:
let contentBlockerIdentifier = Bundle.main.bundleIdentifier! + ".ContentBlocker"
内容的提问来源于stack exchange,提问作者John Cashew
相关产品推荐
相关产品推荐

