Images.xcassets违反目标的法则

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

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

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

我已经检查过复制束资源构build阶段,并且对于每个目标,它实际上每个目标只有一个.xcasset文件夹。

<redacted image>

<redacted image>

当我运行该应用程序时,它正确地加载了appIcon(我不得不重命名为appIcon- <target> ,因为Xcode中的下拉列表显示了它们,无法知道哪个是哪个)。 它还显示正确的软件包名称和启动screen.xib。

下面是图片本身。 正如你所看到的图像是完全不同的:

<redacted image> <redacted image>

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

我不知道这在物理上是可能的,请告诉我:

  1. 我并不疯狂
  2. 我犯了一些我看不见的简单错误
  3. 这不是一个Xcode错误,不需要在types中见过的最精细的工作。 可能重命名所有图像以追加目标名称:-(。

注意

我已经尝试清理,build设,重置模拟器,删除派生数据等在模拟器和实际设备上。

如果我添加一个独特的图像到其中一个文件夹,我可以使用它。 直觉是Xcode合并文件夹?

解决方法

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

如果要编译XCAsset包,则必须在资产编译时将所有这些包指定给XCAsset编译器。 为了支持XCAsset文件,cocoa pod把它能find的所有资源编译成一个目标

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

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

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

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

 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 

它会编译构buildpath中的所有资产目录,因为它无法智能地确定哪些资产目录属于此时的目标。 您需要删除脚本的这一部分。 如果你需要从你的豆荚资产目录,你必须手动添加它们。 每次运行pod安装时,都需要恢复对此文件的更改。

好消息是你没有生气。 玩得开心:D