【问题标题】:How to include a bundle in main project xcode 4.1如何在主项目 xcode 4.1 中包含一个包
【发布时间】:2011-10-05 03:03:36
【问题描述】:

[2015 年 3 月 4 日更新]

这个问题已经 4 年了,适用于我现在在主题中指定的特定版本的 XCode。


我为这个论点搜索了很多,但我找不到解决方案,我什至在stackoverflow上发帖,但由于访问权限很少,我很快删除了这个问题。 现在我再试一次。

我有一个工作区,其中包含两个不同的项目 A 和 B。

B 有两个目标,一个构建静态库 Blib.a,另一个构建捆绑 B.bundle。所有这些都构建在派生目录中。

在项目 A 中,我可以轻松地从构建阶段添加静态库。但是我找不到包含捆绑包的方法。 B.bundle 在 A 中的“复制资源”选项卡中不可见。 因此,我需要手动添加,这意味着。 我也考虑过使用脚本,但我想将此作为最后的选择。

有人对此有解决方案吗?我错过了什么吗?

谢谢

【问题讨论】:

  • 我也尝试将捆绑包直接包含到项目 B 中,但它不起作用
  • 我不敢相信没有人遇到过这个问题。我刚开了一张苹果支持的票,我很快就会发布答案。
  • 仍在等待 Apple 回答问题...似乎没有人知道这个问题的答案。

标签: xcode xcode4 bundle workspace


【解决方案1】:
  1. 将构建切换到Generic iOS Device。此步骤是创建非模拟器引用所必需的。
  2. .bundle拖到另一个项目的Copy Bundle Resources
  3. 在另一个项目的Project navigator中选择.bundle,将其Location改为Relative to Build Products

确保将您的 .bundle 添加到静态库的 Target Dependencies

【讨论】:

    【解决方案2】:

    经过长时间的调查,发现没有简单的方法可以做到这一点。 B.bundle 对 A 项目永远不可见,并且工作区中没有设置可以更改它。 此时有三种解决方案:

    • 从“复制资源->其他”手动包含捆绑包,我从这个开始,但每次发生更改时,您都必须删除并再次包含捆绑包
    • 创建要在构建阶段运行的脚本,如果所有内容都内置到 PRODUCTS 目录中,您可以轻松找到捆绑包并自动复制到 app.bundle 中。这不是一个糟糕的解决方案。如果您使用的是 svn,则该脚本已包含在项目中,用户无需额外工作即可免费获得它。
    • 按照 Apple 技术支持的建议,使用文件夹引用。将包 B 构建到一个文件夹中,并使用“为任何添加的文件夹创建文件夹引用”选项将该文件夹添加到项目 A。每次构建时,Xcode 4 都会将您的包更新到该文件夹​​中。 添加的文件夹一旦包含在您的项目 A 中就会显示为蓝色。

    就是这样,我个人使用脚本,因为如果你使用标准的xcode引用变量如BUILT_PRODUCTS_DIR等,这个解决方案是路径无关的,而shell脚本只是一个cp -r-f

    [2015 年 3 月 4 日更新]

    我想指出,这个问题现在已经 4 岁了。当时没有很多“官方”选项可用。我什至与 Apple 技术支持人员进行了交谈,他们提出解决方案 3 作为唯一可用的解决方案。当然,现在情况很可能发生了变化,并且有更好的解决方案。顺便说一句,我还想补充一点,以上三个不是“黑客”而是“解决方案”,也许技术上已经过时了,但它们现在仍然可以使用。我打算将“hack”作为......“hack”,这意味着它可能不会在未来的软件版本中工作。

    【讨论】:

    • 提示:我使用了类似cp -R -f $BUILT_PRODUCTS_DIR/MyBundle.bundle $BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/ 的东西,它工作得很好。
    • 因为我的 CONTENTS_FOLDER_PATH 包含一个空格,我不得不改用“$CODESIGNING_FOLDER_PATH”。但是感谢您的提示,@mmilo
    • 在使用cp 命令时使用-L 选项很重要,以确保遵循符号链接。否则,当您尝试归档二进制文件时,您将无法通过验证,并且您的 *.bundle 资源将在 *.app 文件中不可用。示例:cp -R -L -f $BUILT_PRODUCTS_DIR/resource.bundle $BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/
    • 查看@0xced's solution below。我遇到了与 OP 完全相同的问题,并且能够按照他建议的方式解决它,这不需要您提出的三个 hack 中的任何一个
    • 这个问题已经存在 4 年了,当时使用 XCode 4 以上是唯一可用的解决方案。
    【解决方案3】:

    这是我的做法。

    1. B.bundle 从项目 B → 产品 → B.bundle 拖放到项目 A 中应用的 复制捆绑资源 构建阶段(选择 创建组 询问时的选项)。这将在您的项目 A 大纲的根目录添加 B.bundle。如果您愿意,可以将其移至 Blib.a 附近的 Frameworks 目录中。

    2. 选择B.bundle 并在身份和类型右侧面板中检查其位置 (Utilities area)。默认情况下,Xcode 选择相对于项目。这是错误的,请选择 Relative to Build Products

    3. B.bundle 的路径现在看起来类似于../../../../../../../../Projects/MyApp/B.bundle。这不是您想要的,但您可以轻松修复它。在文本编辑器中打开ProjectA.xcodeproj/project.pbxproj,搜索此路径并删除其中除B.bundle 之外的所有内容。你的project.pbxproj 应该是这样的:

      explicitFileType = wrapper.cfbundle; name = B.bundle; path = "B.bundle"; sourceTree = BUILT_PRODUCTS_DIR; };
      
    4. 保存您的project.pbxproj 文件。 Xcode 将自动重新加载您的项目,您的应用应该可以正常构建。

    【讨论】:

    • ? 欢呼@0xced,这是一个比已接受答案更可取的解决方案,并且您的说明非常清晰和巧妙地解决了看起来是 Xcode 错误(或至少配置错误)
    • 但是如何将捆绑目标添加为主要项目目标的依赖项?在构建主要项目目标之前,我必须手动构建它。我发现将其添加为依赖项的唯一更好方法是嵌套两个项目,但是当两个项目是工作区中的兄弟姐妹时,我无法将捆绑目标添加为主项目目标的依赖项
    • 静态库 (Blib.a) 依赖于资源包 (B.bundle)。由于静态库由应用程序链接(隐式依赖),因此资源包是自动构建的。示意图:项目 A → Blib.a → B.bundle。
    • 不错的解决方案!对我来说(Xcode 7,项目 B 作为 A 的子项目)B.bundle 甚至没有出现在项目 A 的根目录中,并且默认选择了“相对于构建产品”选项,因此步骤 2-4 没有甚至是必要的!
    【解决方案4】:

    从 Xcode 5.1.1 开始,我可以将 B.bundle 从 Project Navigator 拖放到项目 A Build Phases 的 Copy Bundle Resources 列表中。我认为创建 B.bundle 目标不是问题。

    【讨论】:

      【解决方案5】:

      在搜索了很长时间并多次失败后,我发现这个资源绝对是一个非常棒的教程,用于创建静态库并将捆绑包包含在您的主项目中,甚至可以分发给可能使用您的库的 3rd 方开发人员。

      绝对推荐:

      https://github.com/jverkoey/iOS-Framework

      【讨论】:

      • 问题是关于在同一个工作区中跨项目共享捆绑包。
      • 如果您按照项目中提供的说明进行操作,它将向您展示如何创建一个包含捆绑包的目标并完全实现该目标。您可以在同一个工作区共享包,或者更好的是,您还可以与其他项目共享它。
      【解决方案6】:

      在项目 A 中,项目 B 的产品是您方案的构建操作中的依赖项吗?我认为您可能必须设置此依赖项(有时最好禁用自动依赖项发现选项)才能显示并可以复制到另一个目标。我相信这是因为它在构建之前并不真正存在(如图像资源文件),并且 Xcode 需要确保在从另一个目标使用它之前构建它。

      【讨论】:

      • 再次嗨 :-) 不幸的是,我已经检查过了,A 对 B 有正确的依赖关系。奇怪的是,在复制资源阶段,xcode 只看到项目 A 文件夹。为什么不显示工作区的所有内容?
      猜你喜欢
      • 1970-01-01
      • 2012-03-11
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      相关资源
      最近更新 更多