Ionic 3遗留项目构建报错:OSAtomicCompareAndSwapPtrBarrier冲突求助
解决Ionic 3遗留项目Firebase Messaging的OSAtomic编译报错
问题原因
OSAtomicCompareAndSwapPtrBarrier属于旧版OSAtomic系列API,在macOS 10.12+、iOS 10+已被弃用,且Xcode 14.2启用C99严格编译检查,加上M1架构的适配要求,导致老版本Firebase Messaging中的GtalkExtensions.pbobjc文件触发编译错误。
解决方案
1. 直接修改报错文件
找到项目中的GtalkExtensions.pbobjc文件,执行以下操作:
- 添加头文件导入:在文件顶部加入
解决函数声明缺失的问题。#import <libkern/OSAtomic.h> - 替换为兼容的原子操作函数(推荐,彻底解决弃用问题):
将报错代码段:
替换为C11标准的原子操作代码:if (!OSAtomicCompareAndSwapPtrBarrier(nil, worker, (void * volatile *)&descriptor)) { [worker release]; }
这个函数是苹果推荐的void *expected = nil; if (!atomic_compare_exchange_strong((_Atomic void **)&descriptor, &expected, worker)) { [worker release]; }OSAtomic替代方案,适配M1架构和新Xcode版本。
2. 防止文件被自动覆盖
如果GtalkExtensions.pbobjc是由protobuf自动生成的文件,修改后可能在构建时被覆盖:
- 找到项目中生成该文件的脚本(通常是
package.json或Xcode构建脚本中的protobuf编译命令),在编译参数中添加头文件导入,或者直接修改生成模板。 - 右键点击该文件,选择
Get Info,勾选Locked,锁定文件避免被覆盖。
3. 适配M1架构的Xcode设置
在Xcode项目的Build Settings中调整以下选项:
- 将
Excluded Architectures的Debug和Release模式下都添加arm64(针对模拟器环境)。 - 将
Build Active Architecture Only设置为Yes,减少架构适配冲突。 - 尝试将项目的
Deployment Target提升至iOS 10.0+,确保新原子操作API的兼容性。
4. 重新构建项目
修改完成后,清理Xcode缓存(Command+Shift+K),重新构建项目。
内容的提问来源于stack exchange,提问作者Gladisson
相关产品推荐
相关产品推荐

