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的。
我不知道这在物理上如何可能,请告诉我:
- 我没疯
- 我犯了一些我看不到的简单错误
- 这不是 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
好吧,我正在努力解决这个问题,我真诚地希望我犯了一个愚蠢的错误(涉及到一些深夜)。
简短的背景故事,我们正在构建一个需要品牌化的产品,因为多个客户将共享 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的。
我不知道这在物理上如何可能,请告诉我:
- 我没疯
- 我犯了一些我看不到的简单错误
- 这不是 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