iOS 17使用Image Picker时应用崩溃求助,低版本iOS正常
核心崩溃原因
崩溃日志明确抛出异常:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSTaggedPointerString containsObject:]: unrecognized selector sent to instance 0x9adf0f1f19a13e73'
问题本质是代码错误地给字符串对象(NSTaggedPointerString是NSString的内存优化实现)调用了containsObject:方法——该方法属于NSArray、NSSet等集合类,NSString并无此方法,因此触发未识别选择器异常。
关联上下文与触发条件
日志中附带相机相关警告:
Attempted to change to mode Portrait with an unsupported device (BackWideDual). Auto device for both positions unsupported, returning Auto device for same position anyway (BackAuto).
结合「iOS 17及以上崩溃、低版本正常」的现象,推测是AVFoundation相机框架在iOS 17的API返回值类型发生变更:低版本中某个相机相关API返回集合对象(如NSArray),iOS 17开始返回字符串对象,导致原有调用集合方法的代码出现类型不匹配,触发崩溃。
修复步骤
定位问题代码
- 对崩溃调用栈进行符号化(使用Xcode的
atos工具结合dSYM文件),找到调用containsObject:的具体方法位置。 - 检查该位置的对象来源,确认是从哪个相机API获取的对象。
- 对崩溃调用栈进行符号化(使用Xcode的
添加类型校验与兼容逻辑
- 在调用
containsObject:前,先判断对象类型,分别处理集合和字符串场景:id cameraRelatedObject = ...; // 从相机API获取的目标对象 if ([cameraRelatedObject isKindOfClass:[NSArray class]]) { BOOL hasTargetElement = [(NSArray *)cameraRelatedObject containsObject:@"目标元素"]; // 低版本iOS的原有逻辑 } else if ([cameraRelatedObject isKindOfClass:[NSString class]]) { BOOL hasTargetSubstring = [cameraRelatedObject containsString:@"目标子串"]; // iOS 17及以上的适配逻辑 }
- 在调用
适配iOS 17相机API变更
- 查阅苹果官方AVFoundation iOS 17更新文档,确认涉及相机设备/模式的API返回值变更细节,调整代码逻辑以兼容新旧系统版本。
可选:符号化调用栈方法
若调用栈未显示具体方法名,可通过atos工具解析:
atos -arch arm64 -o 你的应用名.app.dSYM/Contents/Resources/DWARF/你的应用名 -l 0x194fc25e0 0x1b122e114
(替换命令中的应用名、内存地址为实际值)
内容的提问来源于stack exchange,提问作者haya hazaimeh

