Images.xcassets 违反目标法则

Images.xcassets breaking the laws of targets

好吧,我正在努力解决这个问题,我真诚地希望我犯了一个愚蠢的错误(涉及到一些深夜)。

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

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

我检查了复制包资源构建阶段,对于每个目标,它实际上每个目标只有 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

事实证明,如果你想编译 XCAsset 包,你必须在资产编译时将它们全部指定给 XCAsset 编译器。支持 XCAsset 个文件 cocoa pods 将它能找到的所有资源编译成一个目标

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

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

您的解决方案是您需要修改 cocoa pods 在 ./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

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

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