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

升级Xcode后未使用指定iOS SDK编译导致CBATTRequest调用new报错

问题原因解释

Xcode的编译使用的SDK版本由Base SDK配置项决定,和你设置的部署目标(Deployment Target)、模拟器运行版本是完全独立的两个逻辑:

  • Base SDK:决定编译时使用哪套iOS系统的头文件、API规范进行语法校验,版本和你安装的Xcode版本强绑定,升级Xcode后默认会将Base SDK升级为对应最新的iOS SDK版本(你升级后Xcode自带的就是iOS 14.5 SDK)
  • Deployment Target:决定你的App最低可以运行在哪个iOS版本上,不会影响编译阶段的API检查

你升级Xcode前使用的旧版Xcode自带的Base SDK版本低于14.5,该版本SDK中CBATTRequest的init方法还没有被标记为NS_UNAVAILABLE,所以可以正常编译。

解决方案1:手动添加iOS 12.x SDK到新版Xcode
  • 下载对应包含iOS 12.x SDK的旧版Xcode(比如Xcode 10.3对应iOS 12.4 SDK)
  • 右键打开旧版Xcode的包内容,依次进入路径:Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/,提取其中的iPhoneOS12.4.sdk包;如果需要编译模拟器版本,同理从Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/下提取对应模拟器SDK包
  • 打开你当前使用的新版Xcode的包内容,将上面提取的SDK包放到对应平台的相同SDKs目录下
  • 重启Xcode,打开项目构建设置,搜索「Base SDK」,手动选择你刚刚添加的iOS 12.4 SDK即可。如果是Pod依赖的配置,建议在Podfile中添加post_install钩子统一修改所有Pod target的Base SDK配置,避免每次pod install后配置被重置。
解决方案2:绕开编译检查(无需更换SDK)

如果不想额外安装旧版SDK,也可以通过runtime调用绕开编译期的API可用性检查,代码可以改成:

#import <objc/message.h>

// 替代原有[CBATTRequest new]写法
CBATTRequest *request = objc_msgSend(objc_msgSend([CBATTRequest class], @selector(alloc)), @selector(init));

该写法仅会在运行时调用init方法,只要你App的运行环境版本<=12.4即可正常执行,不会出现编译报错。

内容的提问来源于stack exchange,提问作者Quinn Frederick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:57:04