Xcode12.5更新后自定义Swift框架无法构建应用问题咨询
问题根因
- Swift 5.4(Xcode 12.5配套版本)对模块接口的跨版本兼容性校验规则大幅收紧,会严格检查协议符合性的可访问性,不再兼容低版本Swift编译器生成的隐式协议继承逻辑。
- 你使用的Reachability库中
NetworkStatus枚举的Equatable符合性是编译器内部隐式合成的,访问级别为内部(internal),没有在framework的公开模块接口中暴露,导入时Swift 5.4编译器无法找到对应的符合性声明,直接抛出不可用错误。 - 你后续用Swift 5.4重新编译时仍报错,是因为没有显式声明协议符合性的公开访问权限,生成的模块接口依然缺失必要的声明,编译器判定模块接口损坏。
解决方案
- 显式声明
NetworkStatus的公开协议符合性:如果可以修改Reachability库源码,直接在NetworkStatus的枚举定义处添加public修饰的Equatable和Hashable声明:
public enum NetworkStatus: Equatable, Hashable { // 原有枚举定义保持不变 }
如果不希望修改第三方库源码,可在你的自研framework中新增公开扩展,手动实现两个协议的逻辑:
public extension Reachability.NetworkStatus { static func == (lhs: Self, rhs: Self) -> Bool { switch (lhs, rhs) { case (.unavailable, .unavailable): return true case (.wifi, .wifi): return true case (.cellular, .cellular): return true default: return false } } func hash(into hasher: inout Hasher) { hasher.combine(self.rawValue) } }
- 编译framework前确认
BUILD_LIBRARY_FOR_DISTRIBUTION编译配置为YES,该配置是生成稳定、可跨版本使用的模块接口的必要前提。 - 清理Xcode全局编译缓存和旧的xcframework产物,使用Xcode 12.5重新编译生成全新的xcframework。
- 接入应用侧清理DerivedData缓存,移除旧的framework导入,重新导入新生成的xcframework即可完成编译。
内容的提问来源于stack exchange,提问作者gamerounet
相关产品推荐
相关产品推荐

