21

这适用于 Xcode 4.5.x iOS armv7 armv7s 和 sim,特别是关于 Xcode 项目设置/项目构建设置:

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

以下是要求:

  • 必须能够在调试模式下运行“A”,当然还可以在同一个构建/会话中同时调试嵌套的“B”项目。
  • 从“A”中,我可以 CMD+单击“B”中的方法签名并直接跳转到该 src 文件,我可以在其中自由编辑然后重新编译,就好像它来自同一个项目一样。
  • 其他公司的开发人员“X”必须能够轻松地将我们的库“B”拖到他的项目“Y”中,其中“B”是一个静态库,只暴露了所需的头文件。“Y”当然会从“B”的实际头文件的子集中调用方法。只有来自该子集的文件才应包含在 Dev“X”的分发中。
  • Dev "X" 应该不需要在他的 Xcode 项目中修改任何东西,只需将 "B" 的文件夹(包含静态库和头文件的子集)拖到他的项目中,然后单击“复制资源,创建引用等”。
  • 我需要能够轻松地生成“B”的静态库构建,基于我一直在编辑的相同文件,因为我在其依赖项目“A”中迭代和调试这个项目“B”。
  • “B”除了源代码之外没有其他资源——没有图像资产、xib 或类似的东西。
  • 从“B”,我点击“存档”和噗!有一个静态库(必须是胖二进制文件,我的意思是它可以在模拟器 + armv7 + armv7s上运行,拜托!!)以及准备分发的基本头文件。
  • 所有这些都必须是应用商店批准友好的
  • 这也必须是可靠的。如果我每次添加一个文件时都必须不断回来进行大量配置更改,那可不好。

更新:
* 最重要:这需要是一个 repo,我可以查看它是一个完整的端到端模板,我需要能够打开 Xcode 4.5.2+ 并单击播放和看到这个东西构建,无痛。

500 分给任何可以为我提供模板项目的人,该项目演示了我上面描述的所有内容,“A”、“B”和“Y”(使用“B”静态库作为 dep)。我所需要的只是一组骨架项目(“A”、“B”(嵌套在“A”中)和“Y”)来展示如何做到这一点。在发布赏金之前,请不要隐瞒答案。如果它符合我的要求,我会确保你得到我的赏金积分。

我有点担心,由于 Xcode 的限制,这甚至不可能以一种不完全麻烦的方式实现。请证明我错了。

更新:我决定不再关心 armv6。再见,armv6。 如果您可以将 armv6 与 armv7、armv7s、i386/simulator 一起放入 dist 输出中,则可以加分。

PS我保证我会合理奖励积分。我不希望在技术上保留它们。如果你让我在这方面的生活大大减轻痛苦,我很乐意给你加分。

4

3 回答 3

6

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

我认为您至少必须在“复制文件”构建步骤中添加额外的分发标头。但是,如果您更改某些内容,则不需要进行其他修改。

我为 libturbojpeg 做了类似的事情,请参阅https://github.com/dunkelstern/libturbojpeg-ios以供参考。如果您从终端调用“build.sh”文件,它当前会将胖库放入“lib”,但忽略分发标头。在 libturbojpeg 的情况下,我需要 2 个项目文件,因为每个目标都将汇编程序文件的不同子集编译到库中(最好不要查看汇编程序 makefile 的东西)。要编译,您将需要最新版本的 NASM,因为苹果发布的版本很古老(使用 brew 获取)。我很快就会在同一个帐户上发布这样一个库构建项目的模板。(如果在此处使用适当的链接完成,将进行编辑或评论)

基本上它是这样工作的:

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

然后,您可以将输出目录与复制的头文件和lipo合并的通用库一起分发,并像往常一样将该库用作工作区中的子项目(它只构建和链接所需的库,而不是通用库,但应该没问题)

这实际上并不能解决为库创建 DSYM 文件的问题。但通常在构建调试版本时,调试符号应该在库本身中。它将在发布版本中去除调试符号,然后您将没有 DSYM。

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

于 2012-11-08T14:01:56.427 回答
3

我正在使用https://github.com/jverkoey/iOS-Framework来实现与您的需求非常相似的东西。给他所有的信任,我只是总结一下我是如何做到的。

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

  • 添加复制文件阶段以复制标题。我没有使用正确的“复制标题”阶段,因为我在某处读到了不推荐用于 iOS 静态库的地方。
    • 目的地:产品目录
    • 子路径:${PROJECT_NAME}/Headers
  • 更改一些设置:
    • “Dead Code Stripping” => 否(适用于所有设置)
    • “在复制期间剥离调试符号”=> 否(对于所有设置)
    • “条形样式” => 非全局符号(适用于所有设置)
  • 添加运行脚本以使用库准备框架:
    • 使用脚本prepare_framework.sh

您可以在您的应用程序中使用静态库项目:将其拖到您的应用程序项目中,将.a库添加为依赖项并与其链接。您可以与您的应用程序一起调试库、单步执行方法、导航到符号定义等。

准备好的框架将用于分发二进制版本:

在同一个静态库项目中添加一个 Aggregate 目标:

  • 将静态库添加为依赖项。
  • 添加运行脚本阶段以构建缺少的架构。使用脚本build_framework.sh

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

使用这种方法,您可以:

  • 使用静态库作为嵌套项目来构建和调试您的应用程序。
  • 一步构建库的可分发版本,并将标头嵌入到类似框架的包中。构建的框架位于项目 Products 目录中。
  • 使用 Xcode 存档功能。由于某种原因,最终文件未复制到存档位置。您可以使用它来构建框架的剥离版本。

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

关于armv6,我猜您需要旧的 iOS SDK 4.3 并手动将文字添加armv6到有效架构和实际架构的列表中。我现在没有旧的 SDK 来测试它。

于 2012-11-15T17:36:20.580 回答
2

Cocoapods满足您的需求。尽管使用它的标准方法是将 pod 规范提交到中央 git 存储库。它支持添加备用存储库以进行分发,或手动创建它们,请参见此处。使用 cocoapods 的优势在于它既可以满足您的所有要求,而且它正在成为一种非常标准的分发库(例如,被 facebook 和 stackmob 等公司使用)和开源(例如 afnetworking)的方式。因此,如果您现在或将来依赖 3rd 方库,cocoapods 很可能会帮助您处理这种依赖关系。

于 2012-11-22T01:01:41.370 回答