我无法理解 cocoapods 相对于框架的工作方式。我已将问题浓缩为一个简单的项目:
示例项目:https://github.com/weitzel926/WWAlertTester
这包含两个 iOS 项目:
WWAlertTesterFramework - 这是一个使用 Cocoapod 的静态框架。 Cocoapod 是一个警报控制器。该框架提供了一个包装器接口来在最顶层的控制器上显示cocoapod。
WWAlertTesterApp - 此应用程序拉入框架。它有一个按钮。当按下时,它使用该界面来启动框架包装的警报控制器。
问题:如果我不将 pod 包含在测试应用程序的 Podfile 中,则会出现编译错误。 (无法加载“AlertController”的底层模块 - AlertController 是 pod 的名称)。如果我将其包含在我的应用程序 Podfile 中,它可以工作,但控制台会输出错误,因为它在两个位置(本地和框架)找到每个方法实现。
如何在无需在应用程序的 Podfile 中定义 pod 的情况下使其工作。代码在框架中。为什么编译器无法加载它?我将框架放在根目录并将其添加到我的项目中。这不应该是搜索路径问题。我错过了什么?
据我所知,您案例中的
WWAlertTesterFramework
将导入的模块AlertController
标记为对WWAlertTesterApp
可见。你可以跳到Xcode中WWAlertTesterFramework
的定义,import AlertController
应该在那里。
修复错误的一种方法是使用@_implementationOnly。在您的示例中,只需在 AlertTesterInterface.swift 中将
import AlertController
替换为 @_implementationOnly import AlertController
,然后使用新的 WWAlertTesterFramework
再次构建 WWAlertTesterApp
。
另一个修复方法是设置
-enable-experimental-feature AccessLevelOnImport
swift-frontend 标志并使用 Xcode15.2(Swift5.9) 更改导入模块的访问级别。
https://github.com/apple/swift-evolution/blob/main/proposals/0409-access-level-on-imports.md