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.
相关产品推荐
相关产品推荐

