3

好的,所以我在这个问题上咬牙切齿,我真诚地希望我犯了一个愚蠢的错误(涉及到一些深夜)。

简短的背景故事,我们正在构建一个需要品牌化的产品,因为多个客户将共享 90% 相同的 UI 和代码,并带有一些配置选项来打开/关闭事物以及不同的颜色、字体和图像等。

除 .xcassets 文件夹外,一切正常。我每个客户有 1 个,目前他们具有相同的资产名称,具有不同的图像。例如,每个 .xcassets 都有一个ic_settings,但每个的内容都不同。

我已经检查了复制包资源构建阶段,对于每个目标,实际上每个目标只有 1 个 .xcasset 文件夹。

<redacted image>

<redacted image>

当我运行该应用程序时,它会正确加载 appIcon(我必须将其重命名为 appIcon- <target>,因为 Xcode 中的下拉菜单显示了所有内容并且无法知道哪个是哪个)。它还显示正确的包名称和启动 screen.xib。

下面是图片本身。如您所见,图像完全不同:

<redacted image> <redacted image>

但是当我运行客户 1 和客户 2 时。所有图像都是客户 1 的。

我不知道这在物理上是如何实现的,请告诉我:

  1. 我没有疯
  2. 我犯了一些我看不到的简单错误
  3. 这不是 Xcode 错误,也不需要人类所见过的最复杂的工作。可能重命名所有图像以附加目标名称:-(。

笔记

我已经尝试在模拟器和真实设备上清理、构建、重置模拟器、删除派生数据等。

如果我将唯一图像添加到其中一个文件夹,我就可以使用它。直觉是 Xcode 正在合并文件夹????

解决方法

标记的答案是正确的,它是cocoapods。这是一个已知问题,目前最好的解决方法(我发现)是使用这个:https ://github.com/CocoaPods/CocoaPods/issues/1546#issuecomment-61907975

4

1 回答 1

9

事实证明,如果要编译XCAsset捆绑包,则必须XCAsset在资产编译时将所有捆绑包指定给编译器。为了支持XCAsset文件,可可豆荚将它可以找到的所有资产编译到一个目标中

https://github.com/CocoaPods/CocoaPods/pull/1427#issuecomment-26978591

https://github.com/CocoaPods/CocoaPods/issues/1546#issuecomment-43137780

您的解决方案是您需要修改可可豆荚生成的任何文件./Pods/Target Support Files/Pods-(pod target)/Pods-(pod target)-resources.sh

有一个看起来像这样的代码块

if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ `find . -name '*.xcassets' | wc -l` -ne 0 ]
then
  case "${TARGETED_DEVICE_FAMILY}" in
    1,2)
      TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone"
      ;;
    1)
      TARGET_DEVICE_ARGS="--target-device iphone"
      ;;
    2)
      TARGET_DEVICE_ARGS="--target-device ipad"
      ;;
    *)
      TARGET_DEVICE_ARGS="--target-device mac"
      ;;
  esac
  find "${PWD}" -name "*.xcassets" -print0 | xargs -0 actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
fi

它编译构建路径中的所有资产目录,因为此时它无法智能地判断哪些资产目录属于哪个目标。您需要删除这部分脚本。如果您需要 pod 中的资产目录,则必须手动添加它们。每次运行 pod install 时,您都需要恢复对此文件的更改。

好消息是你没有发疯。玩得开心 :D

于 2015-02-25T11:01:49.583 回答