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

Xcode13编译App出现NSJSONReading参数冲突异常该如何解决?

Xcode 13 编译后JSON解析冲突异常排查方案

该异常核心触发原因是JSONSerialization.ReadingOptions同时传入了NSJSONReadingAllowFragments和iOS 15新增的NSJSONReadingAssumeTopLevelDictionary两个互斥配置,可按以下步骤排查:

  • 第一步:添加异常断点定位触发位置
    给NSException添加全局断点,同时新增NSInvalidArgumentException符号断点,触发断点后可直接查看调用栈,定位到是自身业务代码、第三方依赖还是系统隐式调用触发的异常,避免盲目排查。
  • 第二步:排查第三方依赖的JSON解析逻辑
    修改自有代码的配置不代表所有调用逻辑都被覆盖,需要检查所有源码依赖、二进制依赖的第三方库中是否存在JSON解析逻辑:
    • 检查网络库、模型序列化库、自定义工具类库中的JSON解析代码,是否存在版本判断逻辑错误,同时插入两个互斥选项的情况
    • 如使用了闭源的二进制依赖,可升级对应库到适配iOS 15+的最新版本验证
  • 第三步:校验所有JSON解析的选项配置逻辑
    大部分问题都出在选项组合的分支判断错误,错误写法示例:
    // 错误写法:两个选项会同时存在,iOS15+必现崩溃
    var options: JSONSerialization.ReadingOptions = [.allowFragments]
    if #available(iOS 15.0, *) {
        options.insert(.topLevelDictionaryAssume)
    }
    
    正确的互斥分支写法:
    let options: JSONSerialization.ReadingOptions
    if #available(iOS 15.0, *) {
        options = .topLevelDictionaryAssume
    } else {
        options = .allowFragments
    }
    let jsonResult = try JSONSerialization.jsonObject(with: jsonData, options: options)
    
  • 第四步:排查方法交换、全局分类的影响
    如果你曾经对JSONSerialization做过方法交换(swizzle)、或者新增了全局分类方法封装JSON解析,需要检查这些封装代码是否默认添加了两个互斥选项,或者在调用时叠加了外部传入的选项导致冲突。
  • 第五步:临时Hook定位隐式调用
    如上述步骤都无法定位问题,可临时Hook+[NSJSONSerialization JSONObjectWithData:options:error:]方法,每次调用时打印传入的options值和调用栈,只要检测到同时包含两个互斥选项就触发暂停,可精准定位问题触发位置。

内容的提问来源于stack exchange,提问作者Alex Sh.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:06:03