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

