13

我有一个需要为不同客户编译的现有应用程序

每个客户端都需要自己的图标和启动画面。
我还希望能够有条件地包含各种功能,具体取决于特定客户是否需要它们。

我已经尝试为每个客户设置不同的目标,但到目前为止没有太多运气。
具有相同名称但不同路径的不同资源不断混淆。

理想情况下,我希望能够通过复制另一个类似的客户端来构建应用程序,然后只需进行最少数量的更改即可为新客户端创建应用程序。

设置此应用程序的最佳方法是什么?

4

7 回答 7

10

每个客户的单独目标应该是要走的路。对于这些功能,我建议首先在目标设置中设置一个识别客户端的宏(在构建选项卡上的“预处理器宏”下),然后有一个 FeatureDefines.h 文件,如下所示:

#ifdef macroClientA // assume client A wants features 1 and 3
#  define macroFeature1
#  define macroFeature3
#endif

// and similarly for the other clients

现在你可以使用

#import featureDefines
#ifdef macroFeature1

您需要测试功能 1 是否需要的任何地方。

对于单独的图标,您的目标设置可以为每个客户端指定不同的 info.plist 文件,而这些文件又可以为图标指定不同的文件名。

对于单独的初始屏幕,iOS 始终要求将初始屏幕命名为 Default.png,但它们可以放在项目目录的不同子目录中。您可以通过右键单击 Xcode 显示“组和文件”的位置,选择 Target Membership,然后选中您要使用的复选框,并确保未选中其他复选框来控制哪个目标用于哪个目标。

对于资源,我建议您像这样命名您的资源文件:

resourceName.ext // 如果没有特定于客户端的资源,则要使用的通用资源
resourceName-clientName.ext // 特定于客户端的资源

接下来设置一个通用的资源查找器方法,如下所示:

-(NSString *) resourcePathForResourceName: (NSString *) resourceName extension: (NSString *) ext {
  NSString *clientName;
  #ifdef macroClientA
     clientName = @"clientA";
  #endif // and similarly for the other clients
  NSString *clientSpecificName = [NSString stringWithFormat: @"%@-%@.%@", resourceName, clientName, ext];
  NSString *genericName = [NSString stringWithFormat: @"%@.%@"];
  if ([[NSFileManager defaultManager] fileExistsAtPath: clientSpecificName])
     return clientSpecificName;
  else if ([[NSFileManager defaultManager] fileExistsAtPath: genericName])
     return genericName;
  else
    // handle the error
}

通过该方法运行所有资源文件抓取将允许您将特定于客户端的资源添加到您的项目中,而无需更改任何一行代码。

于 2010-12-28T03:00:06.950 回答
7

我有一个类似的场景,我的处理方式如下:

1) 应用程序的核心代码保存在“application_name-base”文件夹中

2)不同的客户端在他们的“application_name-client_name”文件夹中

3) 项目文件位于客户端文件夹中,包括来自基本文件夹的引用,而不使用副本。

4)需要对客户项目唯一的文件在客户文件夹中。通常使用相同名称的图像。或 .h .m 文件,这些文件需要对单个项目是唯一的。还允许您不逐个项目地包含文件。

保持代码集中,但允许每个客户端使用不同的代码,而不会导致混淆。

于 2010-12-21T23:06:11.583 回答
3

您可以为每个客户创建一个单独的目标,并将每个客户资产放在他们自己的同名文件夹中。我做了类似的事情,我有两个项目有很多共同点,只是从每个项目中添加/删除了适当的资产。

对于您的方案,此时您只需将包含客户端特定资源的新文件夹添加到每个目标,并且不需要任何代码更改。如果路径有问题,您可以考虑使用[UIImage imageNamed:]不需要完整路径的方法,只需要文件名。

于 2010-12-21T23:03:55.523 回答
1

我宁愿写一些自动化程序/脚本,而不是使用 XCode 来完成这些任务!

http://developer.apple.com/tools/xcode/automatorforxcode.html

于 2010-12-30T08:07:27.937 回答
0

编写代码以允许外部配置文件完成大部分设置,然后在目标中包含正确的资产。对于每个客户都有一个带有新目标的项目,您可以选择每个目标包含哪些资产。如果您在处理多个目标时遇到问题,您可以使用 git 来管理一个核心项目,然后为每个客户端分支它。

于 2010-12-21T23:03:56.870 回答
0

我只想为客户创建一个设置界面,然后根据他们的公司/个人需求定制应用程序。例如,提供他们照片库中的图像等。

于 2010-12-23T23:22:10.857 回答
0

您可以为每个客户制作项目,并包含来自同一路径的所有源,而无需将它们复制到项目目录中。因此,您将能够在项目中替换图标/启动画面,同时使用相同的代码库。这看起来是迄今为止最简单的方法。

于 2010-12-28T13:10:05.053 回答