如何在Xcode第2部分中创建iOS应用的多个版本

在本教程的第一部分中,我解释了如何为同一应用创建稍有不同的版本。 确保您先阅读此内容。

我遗漏的是如何处理资产。 在本文中,我将解释如何根据构建的配置来创建不同的启动图标和其他资源(例如,在应用程序图标和音频中)。

启动图标

让我们从应用程序的启动图标开始。

还记得我们在第一部分中创建了一个名为LANGUAGE_CODE的自定义构建设置吗? 现在,我们将使用此标志来确保我们使用正确的资产来构建我们的应用程序。

对于这两种应用程序变体(泰文和中文),创建一个新的资产目录:按Command + N>资产目录。 将文件命名为img-th.xcassets(泰语),将文件命名为img-zh.xcassets(中文)。 确保两个文件都勾选了将资产添加到目标的复选框。

现在,通过选择+>新建iOS启动图标来创建新的启动图标。 将图标命名为Thai AppIcon.th,将图标命名为中文AppIcon.zh。

完成此操作后,我们需要告诉编译器使用正确的应用程序图标。 转到第1部分中所述的构建设置。这次,搜索“资产目录”,然后选择构建设置“资产目录应用程序图标集名称”。 输入值AppIcon。$ {LANGUAGE_CODE}

现在,我们可以一个接一个地构建应用程序,它将为每个应用程序显示正确的图标。 问题是,即使我们只需要一个,Xcode现在也将两个启动图标打包在应用程序包中。 在此示例中,这可能还不错,但是假设您有30个这样的应用程序。 每个应用程序中有29个不必要的图标吗? 听起来是个坏主意!

简单方法:从构建中排除不必要的资产

解决方案是名为EXCLUDED_SOURCE_FILE_NAMES的构建设置。 如果只有两个应用程序,则现在可以继续进行操作,并从构建中排除不需要的文件,如下所示:

转到构建设置,然后选择+>添加用户定义的设置。 将新设置命名为EXCLUDED_SOURCE_FILE_NAMES。 设置的值对于泰语应为img-zh.xcassets,对于中文应为th.xcassets(“调试和发行版”的值应相同)

但是,再次想象一下,您有30个应用程序。 那么您将为30个应用中的每一个排除29个资产目录。 不好笑!

进阶方式:包含必要的资产

但是有更好的方法(有点棘手)。 如果只有2-4个应用程序,则可以跳过此步骤,并轻松进行操作。

首先,删除在最后一步中放入EXCLUDED_SOURCE_FILE_NAMES设置中的值。 现在,为您的所有应用程序变体(泰式调试,泰式发行,中文调试,中文发行)赋予相同的值:img-*。xcassets。 之所以有效,是因为EXCLUDED_SOURCE_FILE_NAMES将*理解为通配符。 这意味着您从构建中排除了所有资产。

然后,创建另一个名为INCLUDED_SOURCE_FILE_NAMES的用户定义的构建设置。 为其指定值img-$ {LANGUAGE_CODE} .xcassets。

现在,它将首先排除所有资产,然后仅在构建中包括必要的资产。 这是因为变量INCLUDED_SOURCE_FILE_NAMES在EXCLUDED_SOURCE_FILE_NAMES之后被应用。

(站点注释:您可能会问,为什么会那么麻烦?为什么不先将xcassets从构建目标中保留下来,而不是将其添加并以后再排除它?这是因为当您不包括启动图标时,编译器会抱怨在目标中。)

应用内图标

如果您希望在应用程序变体中有任何不同的图标,这非常容易。 只需在您的资产中创建它们以及启动图标即可。 在构建过程中,将选择正确的资产。

其他资源

在我们的应用程序中,根据应用程序变体,我们需要另外加载两个其他资源:一个数据库文件(我们使用Realm)和一堆音频文件。

您无法将这些文件添加到目标中,而无法通过脚本添加它们:

  1. 在您的项目中创建一个新组,并将其命名为“ data”。为每个变量创建一个子组。 在我们的示例中,它将是data / th和data / zh。 将所有数据放在这些子组中。
  2. 您必须在文件夹中实际创建文件夹,而不仅仅是在Xcode中。 如果手动执行此操作可能会导致麻烦,所以我建议使用命令行工具Synx在finder中重建项目结构。 如文档中所述,按如下方式使用它:$ synx path / to / my / project.xcodeproj
  3. 现在创建一个新的构建阶段:转到项目目标的设置(之前添加构建设置的位置),然后选择“ Build Phases”。 在新的构建阶段中,选择+> New Run Script Phrase和以下Shell脚本:
  cp -r“ $ {PROJECT_DIR} / data / $ {LANGUAGE_CODE}”“ $ {BUILT_PRODUCTS_DIR} / $ {PRODUCT_NAME} .app” 

这会将数据文件夹中的资源复制到应用程序捆绑包中,但当然仅复制每个特定应用程序变体所需的资源。

叹! 完成。 我不得不说,就像我喜欢Swift一样,创建构建变体对于使用iOS来说是一个巨大的痛苦。 使用Android + Gradle可以更加顺畅。

如果您觉得我做的事情太复杂,或者您知道任何聪明的技巧,请告诉我!