如何使用XCode 6构建iOS框架

3
我知道熟悉的教程,但XCode 6模板的引入改变了游戏规则。
我已经观看了WWDC 2014视频,关于构建现代框架,但它更多地讲述了在单个项目中构建扩展、框架和应用程序。它没有说明我使用它制作的框架是否真正可重复使用于任何项目。
我正在按照XCode 6的方式构建框架(文件->新建项目->框架与库->Cocoa Touch框架),但当我将其导入我的测试应用程序项目(与框架项目分开)时,我不断收到各种错误。 例如:包含非模块化头文件在框架内等。
我知道这不是原文的意思,而且无论我做什么都会有很多遗漏的步骤。旧技巧可能适用于所有人,但在XCode 6之后我根本找不到要遵循的方式。
例如,一个框架需要某些文件夹结构,但在构建时XCode 6并不符合它。这是正确的吗?如果不是,我该如何更改XCode构建框架文件夹层次结构的方式?
我是回到老派的方法还是在XCode 6中搞错了一些微小的东西,以至于我无法创建可重用的框架?

创建了一个框架,同时使用 bundle 和 nibs。然而,nibs 无法从 xcassets 中加载图像。如何强制让 nibs 从自己的 xcasset 加载图像(xcassets 不是 bundle 或框架的一部分 - 即使您想通过复制 bundle 资源阶段将其纳入其中也不行)? - Nirav Bhatt
1个回答

2
我不确定你是想使用Objective-C还是Swift来构建框架,因为你的问题没有说明。我在使用Swift时遇到了你提到的错误,所以我将告诉你我的构建Swift框架的方法。
我发现Objective-C的过程非常简单和有文档支持,所以我将跳过这个部分。
至于Swift,有一些事情需要考虑。首先,Swift静态库不受支持,因此在将应用程序链接到库时必须专门使用框架(也称为动态库)。
以下是步骤:
1. 使用IOS>框架和库下的“新建项目”创建框架,并选择Cocoa Touch Framework。 2. 为了避免“ld: warning: directory not found for option...”,请转到您的目标的Build Settings中的Library Search Paths并删除路径。 3. 您不能混合使用Objective-C和Swift,因此甚至不要考虑在代码中添加Swift-Header bridge文件。 4. 在Swift中有一些情况需要从未公开的框架中导入代码。我已经成功地使用了框架内的模块映射来处理这些情况。 5. 我还在Build Settings中选择了CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES,以解决“include of non-modular header inside framework module”。看起来可以工作。 6. 确保生成的头文件标记为Public(而不是Project)。单击该文件,您将在“Target Membership”下的检查器中看到选择。
构建时可能会遇到一些奇怪的错误消息。Xcode有时候会报告链接器错误,当您的代码无法正确编译时,导致链接器缺少输出其二进制文件所需的文件。有时候XCode不会在您正在编译的文件中显示错误,您需要手动查看构建输出并返回到文件。其他时候,您会遇到需要删除缓存的问题。我称这些问题为XCode blues,并经常处理它。我发现在构建库时,这种类型的问题更容易发生。其余部分应该按预期工作。

+1 感谢您提供的库搜索路径 - 它起作用了。我正在使用 Objective-C 进行构建。按照 Apple 的说明构建文件夹结构后,我摆脱了旧错误。但现在我的客户端应用程序无法找到我从框架中导出的视图控制器的对象文件。我没有看到它作为框架的一部分被构建。我只找到了头文件和 Nib 文件。有什么想法吗? - Nirav Bhatt
你是否将文件添加到了特定目标的“编译源”部分?确保点击目标并仔细检查。同时,确保在目标应用程序中包含二进制文件。进入项目设置,选择目标的“常规”选项卡。在“嵌入式二进制文件”部分添加框架。 - John Difool
已经完成了。但我想框架包内缺少一些输出文件。我不知道为什么它不包括Viewcontroller.o,因为Viewcontroller.h是公共头文件之一。 - Nirav Bhatt
糟糕,我在你回复时进行了编辑。请检查我之前评论中的第一句话。 - John Difool
是的,那也是我第一次检查的 - viewcontroller.m 在编译文件列表中。 - Nirav Bhatt
我感觉XCode 6没有做到的是自己在框架内编写可执行代码。我提到的第一个教程 - 它在静态库之上构建框架 - 这是我一开始应该做的事情,而不是依赖XCode的内置框架项目模板。我认为现在我在正确的轨道上了。 - Nirav Bhatt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接