如何在包含Swift的iOS中创build开发框架?

我的目标是创build一个兼容Swift和Objective-C的iOS框架,我可以在我的开发项目中使用它。 这个框架的本质是框架本身正在发展。 所以,每次我使用这个框架来构build一个项目(我会用“缺less一个更好的术语来使用”项目来调用项目),我想确保框架本身被重新构build,这一点很重要。 我希望这是一个框架,因为我有几个使用应用程序,我想使用相同的框架代码。 我为今天的一大堆努力挣扎着,浪费了大量的时间,至less在我的想法中,应该是这样的。 所以,我会分享我的过程。

首先要注意的是(这当然不是我的第一个观察!)是你不能在iOS下使用静态库来做到这一点。 Xcode不会让你在静态框架中使用Swift试试吧。 Xcode会否认你的愿望!

这是我结束的过程。 我不得不处理的两个主要问题是:(i)使Xcode链接到使用项目中的框架,没有错误,(ii)访问使用项目中框架的标题。 在苹果的开明看来,这两个问题是分开的。 注意讽刺。 )。

1)使用Xcode创build一个Cocoa Touch Framework 。 我相信这适用于Xcode6和Xcode7。 使用:

文件>新build>项目> iOS>框架和库>cocoa触摸框架

我碰巧使用Xcode7。 (不要做一个Cocoa Touch Static Library – 就像我上面所说的,Xcode不会让你把Swift合并到静态库中)。

2)使用Swift类,确保成员和函数是公开的 。 我还没有尝试过,但似乎公共属性是必要的成员和function是可见的框架的用户。

3)添加你想要的Swift类(和Objective-C)到你的框架。

4)closures该框架项目。 (同一个项目在Xcode中不能打开两次,下一步你需要把框架结合到你的使用项目中)。

5)在Xcode中打开你使用的项目。 对我来说这是一个现有的通用应用程序项目。 您可能正在创build一个新的使用项目。 在任何情况下,将Finder中的框架项目的.xcodeproj文件拖到您使用的项目中。

6)在你使用的项目里面,打开你的框架项目。 然后将框架文件拖到“构build阶段”中的“ Embed Frameworks (当我第一次开始实验时,“构build阶段”中不存在“ Embed Frameworks部分,但我不知道是什么魔法导致它出现!

在这里输入图像说明

到目前为止,这些步骤应该使您能够构build和链接,而无需实际集成库代码的使用。 (我为我的一些testing使用了https://github.com/RadiusNetworks/swift-framework-example )。

7)现在对于优化:在Build Settings ,searchFramework Search Paths 。 并join:

 ${TARGET_BUILD_DIR}/YourFrameworkName.framework 

(看来你不必把这个标记为recursion)。

8)在使用框架的Swift代码文件中,需要在每个文件的顶部添加一个导入:

 import YourFrameworkName 

你现在应该可以build立和链接使用你的新库!

9)另外一个问题:确保您的框架的Deployment Target与您的目标项目匹配。 例如,如果您使用的项目是为iOS7构build的,请确保您的框架是为iOS7或更早版本构build的。

10)第二个问题(10/23/15):我刚刚得知我的框架有必要在构build中使用“App-Swift.h”(我用这个名字)作为Objective-C生成的接口头名设置。 当我将这个(Objective-C生成的接口头文件)取出(试图解决另一个问题)时,我得到了在App-Swift.h中出现的一些有趣的问题。 这些问题看起来像这样: “无法findNSObject的接口声明”?

11)第三个问题(10/29/15):当我尝试将我的第一个应用程序上传到使用此框架的iTunes Connect时,出现上传错误。 读取的错误:

错误ITMS-90206:“Invalid Bundle。”Your.app/Frameworks/YourFramework.framework“中的包含不允许的文件”Frameworks“。

各种SO和其他post都遇到了这种错误,对我来说,对于框架目标,在Build Settings中,将“Embedded Content Contains Swift Code”设置为NO。 (我的应用程序生成设置有此标志设置为否)。

完成大部分步骤的示例项目位于https://github.com/crspybits/CocoaTouchFramework.git