You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 07:03:16