首先要观察(这肯定不是我的第一个观察!)是你不能在 iOS 下使用静态库来做到这一点。 Xcode 不会让你在静态框架中使用 Swift 试试看。 Xcode 会拒绝你的意愿!
这是我最终完成的过程。我必须处理的两个主要问题是:(i)使 Xcode 链接到 using 项目中的框架而没有错误,以及(ii)在 using 项目中访问框架的标头。在苹果的开明观点中,这两个问题是分开的。注意讽刺。 ;)。
1) 使用 Xcode 创建一个Cocoa Touch Framework。我相信这适用于 Xcode6 和 Xcode7。使用:
文件 > 新建 > 项目 > iOS > 框架和库 > Cocoa Touch
框架
我碰巧在使用 Xcode7。 (不要创建Cocoa Touch Static Library——就像我上面说的,Xcode 不会让你将 Swift 合并到静态库中)。
2) 对于您的 Swift 类,确保成员和函数是 public。我没有对此进行过实验,但似乎 public 属性对于框架用户可见的成员和函数是必需的。
3) 将您想要的任何 Swift 类(和 Objective-C)添加到您的框架中。
4) 关闭该框架项目。 (同一个项目不能在Xcode中打开两次,接下来需要将框架合并到你使用的项目中)。
5) 在 Xcode 中打开您正在使用的项目。对我来说,这是一个现有的通用应用程序项目。您可能正在创建一个新的 using 项目。无论如何,将您的框架项目的 .xcodeproj 文件在 Finder 中拖到您正在使用的项目中。
6) 在您使用的项目中,打开您的框架项目。并将框架文件拖到 Build Phases 中的 Embed Frameworks 中(当我第一次开始实验时,Build Phases 中没有 Embed Frameworks 部分,我还不知道是什么魔法导致它出现!)。
到目前为止,这些步骤应该使您能够构建和链接,而无需实际集成库代码的使用。
(我在一些测试中使用https://github.com/RadiusNetworks/swift-framework-example)。
7) 现在是致命一击:在Build Settings 下,搜索Framework Search Paths。并添加:
${TARGET_BUILD_DIR}/YourFrameworkName.framework
(您似乎不必将其标记为递归)。
8) 在您使用框架的 Swift 代码文件中,您需要在每个文件的顶部添加一个导入:
import YourFrameworkName
您现在应该可以使用新库进行构建和链接了!
9) 还有一个问题:确保您的框架的Deployment Target 与您的目标项目匹配。例如,如果您使用的项目是为 iOS7 构建的,请确保您的框架是为 iOS7 或更早版本构建的。
10) 第二个问题 (10/23/15):我刚刚了解到我的框架必须有“App-Swift.h”(我为此使用的名称)作为 Objective-C 生成的接口头文件构建设置中的名称。当我把这个(Objective-C Generated Interface Header)拿出来(试图解决另一个问题)时,我在 App-Swift.h 中遇到了一些有趣的问题。这些问题看起来像:
"Cannot find interface declaration for NSObject"?
11) 第三个问题 (10/29/15):当我尝试将我的第一个应用程序上传到使用此框架的 iTunes Connect 时,我收到了一个上传错误。错误读取:
错误 ITMS-90206:“无效的捆绑包。捆绑包位于
'Your.app/Frameworks/YourFramework.framework' 包含不允许的文件
'框架'。”
各种 SO 和其他帖子都遇到了这种错误,对我来说,诀窍是,对于 Framework 目标,在 Build Settings 中,将“Embedded Content Contains Swift Code”设置为 NO。 (我的应用构建设置已经将此标志设置为 NO)。
已完成大部分步骤的示例项目位于https://github.com/crspybits/CocoaTouchFramework.git