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

iOS 17使用Image Picker时应用崩溃求助,低版本iOS正常

iOS 17 应用崩溃问题分析与修复方案

核心崩溃原因

崩溃日志明确抛出异常:

*** 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开始返回字符串对象,导致原有调用集合方法的代码出现类型不匹配,触发崩溃。

修复步骤

  1. 定位问题代码

    • 对崩溃调用栈进行符号化(使用Xcode的atos工具结合dSYM文件),找到调用containsObject:的具体方法位置。
    • 检查该位置的对象来源,确认是从哪个相机API获取的对象。
  2. 添加类型校验与兼容逻辑

    • 在调用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及以上的适配逻辑
      }
      
  3. 适配iOS 17相机API变更

    • 查阅苹果官方AVFoundation iOS 17更新文档,确认涉及相机设备/模式的API返回值变更细节,调整代码逻辑以兼容新旧系统版本。

可选:符号化调用栈方法

若调用栈未显示具体方法名,可通过atos工具解析:

atos -arch arm64 -o 你的应用名.app.dSYM/Contents/Resources/DWARF/你的应用名 -l 0x194fc25e0 0x1b122e114

(替换命令中的应用名、内存地址为实际值)

内容的提问来源于stack exchange,提问作者haya hazaimeh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:35:18