与iOS的Xcode – 创build一个易于在debugging模式下运行的库,分发,迭代

这是Xcode 4.5.x iOS armv7 armv7s以及关于Xcode项目设置/项目构build设置的模拟和特殊说明:

我有一个应用程序商店中的应用程序“A”。 我有一个项目“B”,它是一个库,将作为依赖项用于A,而且还作为第三方库分发给其他公司在其应用程序中使用。 (其他公司的第三方应用程序在这种情况下表示为“Y”)。

这是要求:

  • 必须能够在debugging模式下运行“A”,当然也可以在同一个build / session中同时debugging嵌套的“B”项目。
  • 从“A”我可以CMD +点击从“B”的方法签名,并跳转到该src文件,我可以自由编辑,然后重新编译,就好像它是从同一个项目。
  • 其他公司的开发者“X”必须能够容易地把我们的库“B”拖到他的项目“Y”中,其中“B”是一个静态库,只有需要的头文件被公开。 “Y”当然是从“B”的实际头文件的子集调用方法。 只有来自这个子集的文件应该包含在Dev“X”的发行版中。
  • 在他的Xcode项目中,Dev“X”根本不需要修改任何东西,只需将“B”(包含静态库和头文件子集)的文件夹拖到他的项目中,然后单击“复制资源,创build引用等等”。
  • 我需要能够很容易地生成“B”的静态库版本,基于我一直在编辑这整个时间的相同文件,因为我在其依赖项目“A”中迭代和debugging此项目“B”。
  • 除了源代码之外,“B”没有资源 – 没有图像资产,xib或类似的东西。
  • 从“B”,我点击“存档”和Poof! 有一个静态库(必须是胖二进制文件,我的意思是它可以在模拟器上运行+ armv7 + armv7s ,请!!)与必要的头文件准备分发。
  • 所有这一切都必须是应用程序商店审批 –友好
  • 这也必须是可靠的。 如果每次添加一个文件,都必须不断地重新进行configuration更改,这是不好的。

更新:
* 最重要的是 :这需要一个回购我可以看看,这是一个完整的端到端的模板,寻找什么,我需要能够打开Xcode 4.5.2 +,然后点击播放,看到这个东西build立,无痛苦。

500分给任何能够提供给我一个模板项目的人,这个项目演示了我上面描述的一切,“A”,“B”和“Y”(带有“B”静态库作为dep)。 我所需要的是一组骨架项目(“A”,“B”(嵌套在“A”中)和“Y”),它们显示了如何做到这一点。 请等到赏金发布后再回答。 如果它符合我的要求,我会确保你得到我的赏金点。

我有些担心,有了Xcode的限制,这是不可能的方式不是一个完整的麻烦。 请certificate我错了。

更新:我决定我不在乎armv6了。 再见,armv6。 额外的功劳,如果你可以得到armv6随着armv7,armv7s,i386 /模拟器卷到dist输出。

PS我保证我会合理地授予积分。 我不打算在技术上阻止他们。 如果你在这个领域让自己的生活变得不那么痛苦,我会很乐意给你奖励。

这在Xcode中是不可能的。 由于编译目标开关(模拟器,设备等),您将需要一些构build脚本(您可以从Xcode当然调用)。

我想你将不得不添加额外的分发标题到“复制文件”构build步骤至less。 但是如果你改变了某些东西,其他的修改就不需要了。

我为libturbojpeg做了这样的事情,请参阅https://github.com/dunkelstern/libturbojpeg-ios以供参考。 如果你从terminal调用“build.sh”文件,它会把一个胖库放到“lib”中,但是省略了分配头文件。 在libturbojpeg的情况下,我需要2个项目文件,因为每个目标都将汇编文件的不同子集编译到库中(最好不要看汇编程序的makefile文件)。 编译你将需要一个最新版本的NASM,因为苹果船的版本是古老的(用brew来获得它)。 我将很快在相同的帐户上发布一个这样的图书馆build设项目的模板。 (将编辑或评论如果在这里做适当的链接)

基本上它是这样工作的:

  1. 创build一个为每个需要的平台目标调用xcodebuild的构build脚本
  2. Xcode库项目必须包含一个脚本,将构build的库放到构build脚本可以find的目录中
  3. 额外的标题必须通过“复制文件”目标操作来复制
  4. 构build脚本必须将所有库构build与lipo合并
  5. 将构build脚本作为“运行脚本”目标添加到您的构build中,但请注意,您不要创build无限循环(或者只是从terminal调用它来创build发布构build)
  6. 在你的主项目中添加库子项目

然后,您可以使用复制的头文件和lipo合并的通用库来分发输出目录,并将其正常地用作工作空间中的子项目(正常情况下它只会构build并链接所需的库),而不是通用库应该没有问题)

这实际上并不能解决为库创buildDSYM文件的问题。 但是通常debugging符号在构builddebugging版本时应该在库本身中。 它会剥离发布版本上的debugging符号,然后你将没有DSYM。

链接到示例项目: https : //github.com/dunkelstern/StaticLibraryTemplate

我使用https://github.com/jverkoey/iOS-Framework来实现与您的需求非常相似的内容。 给他所有的功劳,我只是总结我是怎么做到的。

像往常一样创build一个静态库加上这些调整:

  • 添加复制文件阶段来复制标题。 我不使用正确的“复制标题”阶段,因为我读的地方不build议iOS静态库。
    • 目的地:产品目录
    • 子path: ${PROJECT_NAME}/Headers
  • 更改一些设置:
    • “死代码剥离”=>否(对于所有设置)
    • “复制期间去除debugging符号”=>否(对于所有设置)
    • “Strip Style”=>非全局符号(对于所有设置)
  • 添加一个运行脚本来准备一个与库的框架:
    • 使用脚本prepare_framework.sh

您可以在应用程序中使用静态库项目:将其拖动到您的应用程序项目中,添加.a库作为依赖关系并链接到它。 您可以随应用程序一起debugging库,进入方法,导航到符号定义等。

准备好的框架将被用来分发一个二进制版本:

在相同的静态库项目中添加一个聚合目标:

  • 将静态库添加为依赖项。
  • 添加运行脚本阶段以构build缺less的体系结构。 使用脚本build_framework.sh

该脚本猜测另一个平台是什么,并使用xcodebuild来编译它。 然后使用lipo来创build一个包含所有体系结构的胖二进制文件。 胖静态库的目的地将是我们之前创build的框架树。 最终的框架被复制到生成文件夹中的产品文件夹。

采用这种方法,您可以:

  • 使用静态库构build和debugging您的应用程序作为嵌套项目。
  • 一步一步 构build的可分发版本,并将头embedded类似框架的捆绑包中。 构build的框架位于项目Products目录中。
  • 使用Xcode存档function。 出于某种原因,最终文件不会复制到归档位置。 您可以使用它来构build一个框架的剥离版本。

随意使用这种技术克隆一个项目来打包库: json-framework fork 。 我稍微修改了脚本,检查我的iOS框架的叉子。

关于armv6 ,我猜你需要和旧的iOS SDK 4.3,并手动添加文字armv6到有效的体系结构和实际体系结构的列表。 我现在没有和旧的SDK进行testing。

Cocoapods涵盖您的需求。 虽然使用它的标准方法是将pod规范提交给中央git回购。 它支持添加备用的分发版本,或手动创build它们,请参阅此处 。 使用cocoapods的优势在于它既能满足您的所有需求,又能成为一种非常标准的分发库(例如由诸如facebook&stackmob等公司使用)和开放源代码(例如networking连接)的方式。 所以,如果你现在或将来都依赖第三方库,那么cocoapods有可能帮助你处理这种依赖。