好吧,所以我正在为这个问题拔牙,我真诚地希望我犯了一个愚蠢的错误(涉及到一些深夜)。
简短的背景故事,我们正在构建一个需要品牌化的产品,因为多个客户将共享 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 的。
我不知道这在物理上是如何可能的,请告诉我:
- 我没有疯
- 我犯了一些我看不到的简单错误
- 这不是 Xcode 错误,也不需要人类所见过的最复杂的工作。可能会重命名所有图像以附加目标名称:-(。
Note
我尝试过在模拟器和真实设备上清理、构建、重置模拟器、删除派生数据等。
如果我将唯一的图像添加到其中一个文件夹中,我就可以使用它。直觉是 Xcode 正在合并文件夹???
解决方法
标记的答案是正确的,它是cocoapods。这是一个已知问题,目前最好的解决方法(我发现)是使用以下方法:https://github.com/CocoaPods/CocoaPods/issues/1546#issuecomment-61907975 https://github.com/CocoaPods/CocoaPods/issues/1546#issuecomment-61907975
原来如果你想编译XCAsset
捆绑包你必须将它们全部指定给XCAsset
资产编译时的编译器。支持XCAsset
文件 cocoa pods 将它能找到的所有资源编译到一个目标中
see https://github.com/CocoaPods/CocoaPods/pull/1427#issuecomment-26978591 https://github.com/CocoaPods/CocoaPods/pull/1427#issuecomment-26978591
and https://github.com/CocoaPods/CocoaPods/issues/1546#issuecomment-43137780 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
它会编译构建路径中的所有资产目录,因为此时它无法智能地判断哪些资产目录属于哪个目标。您需要删除这部分脚本。如果您需要 pod 中的资产目录,则必须手动添加它们。每次运行 pod install 时,您都需要恢复对此文件的更改。
好消息是你没有生气。玩得开心:D
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)