我有一个需要为不同客户编译的现有应用
每个客户都需要自己的图标和启动画面 我还希望能够有条件地包含各种功能,具体取决于特定客户是否需要它们。
我尝试为每个客户设置不同的目标,但到目前为止没有太多运气 具有相同名称的不同资源,但不同的路径不断混淆。
理想情况下,我希望能够通过复制另一个类似的客户端来构建应用程序,然后只需进行最小数量的更改即可为新客户端创建应用程序。
设置此应用的最佳方式是什么?
答案 0 :(得分:9)
每个客户的单独目标应该是可行的方法。对于这些功能,我建议首先在目标设置中设置一个标识客户端的宏(在构建选项卡上的“预处理器宏”下),然后使用如下所示的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表示“Groups& Files”的位置,选择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
}
通过该方法运行所有资源文件抓取将允许您在不更改单行代码的情况下将特定于客户端的资源添加到项目中。
答案 1 :(得分:6)
我有类似的情况,我如何处理它如下:
1)应用程序的核心代码保存在“application_name-base”文件夹中
2)不同的客户端位于“application_name-client_name”文件夹
中3)项目文件位于客户端文件夹中,并包含基础文件夹中的引用,而不使用副本。
4)客户端项目需要唯一的文件位于客户端文件夹中。通常使用相同名称的图像。或.h .m文件,需要对单个项目是唯一的。还允许您不按项目包含项目中的文件。
保持代码中心,但允许每个客户端使用不同的代码而不会导致混淆。
答案 2 :(得分:3)
您可以为每个客户端创建单独的目标,并将每个客户端资产放在具有相同名称的自己的文件夹中。我做了类似的事情,我有两个有很多共同点的项目,只是添加/删除了每个项目的相应资产。
根据您的方案,此时您只需向每个目标添加具有客户端特定资源的新文件夹,并且不需要任何代码更改。如果路径存在问题,您可以考虑使用[UIImage imageNamed:]
方法,该方法不需要完整路径,只需要文件名。
答案 3 :(得分:1)
我宁愿写一些automator / scripts而不是使用XCode来履行这些职责!
http://developer.apple.com/tools/xcode/automatorforxcode.html
答案 4 :(得分:0)
编写代码以允许外部配置文件执行大部分设置,然后在目标中包含正确的资产。让一个项目为每个客户提供一个新目标,您可以选择每个目标包含哪些资产。如果您遇到多个目标时遇到问题,可以使用git来管理核心项目,然后为每个客户分支。
答案 5 :(得分:0)
我只需为客户创建一个设置界面,然后根据公司/个人需求自定义应用。例如,从他们的照片库等提供图像
答案 6 :(得分:0)
您可以为每个客户创建项目,并包含来自同一路径的所有源,而不将其复制到项目目录中。 因此,您可以使用相同的代码库替换项目中的图标/启动画面。 这看起来是迄今为止最简单的方法。