2015-09-28 56 views
3

我的目标是创建一个包含Swift和Objective-C的iOS框架,我可以在我的开发项目中使用它。这个框架的本质是框架本身正在发展。所以,每次我使用这个框架构建项目(我将使用框架“使用”项目缺乏更好的术语来调用项目)时,重要的是我想确保框架本身被重新构建。我希望这是一个框架,因为我有几个使用应用程序,我希望使用相同的框架代码。我一直在努力争取今天的一大堆好处,并且浪费了大量的时间在本应该是的,至少在我看来,更容易。所以,我会分享我的过程。如何在包含Swift的iOS中创建开发框架?

回答

6

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

下面是我结束的过程。我必须处理的两个主要问题是:(i)使Xcode链接到使用项目中的框架而没有错误,并且(ii)在使用项目中访问框架的标题。在苹果的启发下,这两个问题是分开的。注意讽刺。 )。

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

文件>新建>项目>的iOS>框架&库>可可触摸 框架

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

2)用你的Swift类,确保成员和功能是public。我还没有尝试过这一点,但似乎公共属性是成员和功能对框架用户可见的必要条件。

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

4)关闭该框架项目。 (同一个项目无法在Xcode中打开两次,下一步您需要将框架合并到您使用的项目中)。

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

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

enter image description here

这些措施到目前为止应该使您能够构建和链接,而无需实际尚未整合你的库代码的使用。 (我在使用https://github.com/RadiusNetworks/swift-framework-example进行一些测试)。

7)现在对于coup de de grace:在Build Settings下,搜索Framework Search Paths。并添加:

${TARGET_BUILD_DIR}/YourFrameworkName.framework 

(看来你必须有这个标记为递归)。

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

import YourFrameworkName 

您现在应该使用新的库能够构建和链接!

9)还有一个问题:确保您的框架的Deployment Target与您的目标项目匹配。例如,如果您的使用项目是为iOS7构建的,请确保您的框架适用于iOS7或更早版本。我刚刚得知我的框架有必要将“App-Swift.h”(我为此使用的名称)作为Objective-C生成的接口标题名称在Build Settings中。当我将这个(Objective-C生成的接口头文件)取出(试图解决另一个问题)时,我得到了App-Swift.h中出现的一些有趣的问题。这些问题如下所示: "Cannot find interface declaration for NSObject"?

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

ERROR ITMS-90206: “无效的捆绑在 'Your.app/Frameworks/YourFramework.framework' 套装中包含不允许的文件 '框架'。”

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

与大多数的这些步骤完成一个例子项目是https://github.com/crspybits/CocoaTouchFramework.git

+0

是不是不安全给予框架,其他谁愿意使用你的框架的总xocdeproject?它不会让你的应用对所有人开放吗? – Saty

+0

“让您的应用程序对所有人开放”是什么意思?正如我所提到的,这篇文章是在我自己的开发项目中进行的。我一直没有把我的框架分发给其他一些安全问题或封闭源代码问题。 –

+0

好吧然后它的好。谢谢王子... – Saty