Images.xcassets 违反目标法则

2024-03-21

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

简短的背景故事,我们正在构建一个需要品牌化的产品,因为多个客户将共享 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 错误,也不需要人类所见过的最复杂的工作。可能会重命名所有图像以附加目标名称:-(。

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(使用前将#替换为@)

Images.xcassets 违反目标法则 的相关文章

随机推荐

  • Delphi和HDD I/O引用、资源预缓存、读/写/查找参数限制

    我有充满字节的动态数组 这些数组是使用 BlockRead 从 raw 文件中读取的 从逻辑上讲 此操作需要大量的 Shell 资源 我想知道是否有任何方法可以保留一定数量或限制最大数量读 写 查找用于程序运行时从硬盘驱动器 澄清 我的意思
  • 通过 Git Hub 秘密传递 build.gradle android 中的 local.properties

    我正在尝试自动化 Android 应用程序的构建过程 我已将 baseUrl 存储在 local properties 文件中 并通过 Github 秘密传递文件内容 但 Github 操作一直失败 构建 gradle def propFi
  • 使用 Linq2SQL 删除记录时出错

    我最近收到了客户的错误报告 但没有解决它 我希望有人能给我一些可能出错的见解 这个错误看起来很简单 Csla DataPortalException DataPortal Delete 失败 System InvalidOperationE
  • Pandas groupby/apply 对 int 和 string 类型有不同的行为

    我有以下数据框 X Y 0 A 10 1 A 9 2 A 8 3 A 5 4 B 100 5 B 90 6 B 80 7 B 50 和两个非常相似的不同功能 def func1 x if x iloc 0 X A x D 1 else x
  • 在 C++ 中使用 memcpy

    我对参数有点困惑memcpy http en cppreference com w c string byte memcpy功能 如果我有 int arr new int 5 int newarr new int 6 我想复制其中的元素ar
  • 用于管理阻止/限制 google/Gsuite 中加载项的策略的 google API 是什么

    我需要阻止 限制用户访问特定的加载项 我可以使用谷歌管理门户 安全 gt API 控制 来阻止加载项 这解决了问题 但我不想手动执行此操作 而是想使用谷歌 API 来自动执行相同的操作 我尝试探索用户 令牌等 API 但找不到选项 如果您能
  • iCloud 和 NSFileWrapper:在“设置”中显示为 2 个不同的文件

    我有一个使用基于 NSFileWrapper 的 UIDocument 的应用程序 我的文件包装器是一个名为 XXX cp 的目录 其中有两个子文件 photo data 和 photo metadata 它似乎可以很好地保存和加载文档 但
  • Python 中的循环命名

    我最近读过这个问题 https stackoverflow com questions 886955 breaking out of nested loops in java 886979 886979其中有一个关于 Java 中标记循环的
  • 丢失 .idea 文件夹后如何在 Android Studio 中重新创建项目?

    我一直试图通过尝试一些东西来了解 Android Studio IDE 的工作原理 我从 Google 存储库导入了示例项目之一 Android DataLayer 它附带了一些配置的模块 然后我删除了 idea文件夹并想再次打开该项目 但
  • 我们可以使用 data.table 按组设置顺序吗?

    简单的问题 我想用data table setorder在我的 DT 上 但我不能按组执行此操作 是否可以 在此示例中 我订购了整个 DT DT data table a rep c C A D B E each 4 b sample 1
  • 在自定义格式化程序中访问 rowObejct

    在 jqgrid wikki 中 我读到 虽然使用 xml 数据类型 rowobject 将不是一个数组 在 json 中 我使用 rowobject 1 2 等获取了列值 但是如何使用 xml 数据类型来实现这一点 请提供使用 xml 数
  • 确定在哪个表视图中按下了单元格按钮?

    我有像测验这样的表格视图单元格 在每个单元格中我都有一个按钮 我如何识别按下了哪个单元格按钮 也许通过 IndexPath 这就是我将按钮连接到的方式 func tableView tableView UITableView cellFor
  • 带有 SDK 4.2 的 Xcode 始终启动 iPad 模拟器

    为什么 Xcode 在更新到 SDK 4 2 后总是在 iPad Simulator 而不是 iPhone 中运行我的应用程序 如果我选择 iPhone Simulator 作为活动可执行文件 它不会存储我的首选项 并在任何新的 构建和运行
  • 应用程序关闭后无法保持 Android 服务处于活动状态

    我正在尝试生成一个始终保持活动状态的服务 即使用户关闭应用程序也是如此 根据这些线程 当应用程序关闭时保持位置服务处于活动状态 https stackoverflow com questions 21441232 keep location
  • 如何判断在touchesBegan中哪个对象被触摸了?

    我知道这是一个非常常见的问题 但每个网站上的所有答案都不起作用 如果你还是不明白我的意思 那么也许这行代码会帮助你理解 void touchesBegan NSSet touches withEvent UIEvent event UITo
  • 有没有办法将 Google Sheets 工作簿中的值绘制到 TradingView pinescript 中?

    我正在尝试将 GoogleSheets 工作簿中计算的值绘制在交易视图图表上 我无法在 Tradingview 中进行相同的计算 因为这些值来自动态网页 所以我在 excel 中进行计算 并且想知道是否可以以某种方式将这些值发送到 Trad
  • PySpark 时间戳的毫秒数

    我试图获取两个时间戳列之间的差异 但毫秒消失了 如何纠正这个问题 from pyspark sql functions import unix timestamp timeFmt yyyy MM dd HH mm ss SSS data 1
  • 在 C# 中实现套接字侦听器的最佳方法

    我已经搜索过答案 但找不到类似的东西 我对 C 相当陌生 我需要使用 WinForms 在 C 中创建一个程序 它基本上有 2 个组件 UI 然后我需要一个永久侦听套接字 TCP 端口的进程 如果收到任何内容 那么我需要引发一个事件或类似的
  • 计算一年中第一周的星期一的最简单方法是什么

    我想过去一年并得到一个代表第一周第一个星期一的日期 so 如果一个传入2011 我会回来的2011 年 1 月 3 日 如果一个传入2010 我会回来的2010 年 1 月 4 日 private DateTime GetFirstMond
  • Images.xcassets 违反目标法则

    好吧 所以我正在为这个问题拔牙 我真诚地希望我犯了一个愚蠢的错误 涉及到一些深夜 简短的背景故事 我们正在构建一个需要品牌化的产品 因为多个客户将共享 90 相同的 UI 和代码 并使用一些配置选项来打开 关闭以及不同的颜色 字体和图像等