我有一个已经存在的应用程序,需要为不同的客户编译。
每个客户都需要自己的图标和启动画面。
我还希望能够有条件地包含各种功能,具体取决于特定客户是否需要。
我尝试为每个客户设置不同的目标,但到目前为止没有太大成功。
相同名称但具有不同路径的不同资源会混淆在一起。
理想情况下,我希望能够通过复制一个类似的客户端来构建一个应用程序,然后只需进行最少量的更改即可为新客户创建应用程序。
如何最佳地设置此应用程序?
我有一个已经存在的应用程序,需要为不同的客户编译。
每个客户都需要自己的图标和启动画面。
我还希望能够有条件地包含各种功能,具体取决于特定客户是否需要。
我尝试为每个客户设置不同的目标,但到目前为止没有太大成功。
相同名称但具有不同路径的不同资源会混淆在一起。
理想情况下,我希望能够通过复制一个类似的客户端来构建一个应用程序,然后只需进行最少量的更改即可为新客户创建应用程序。
如何最佳地设置此应用程序?
为每个客户端设置单独的目标应该是正确的方式。对于特性,建议首先在目标设置中设置一个宏来识别客户端(在构建选项卡下的“预处理器宏”中),然后创建一个名为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
}
通过该方法运行您所有的资源文件获取,将允许您向项目添加特定于客户端的资源,而无需更改任何代码。
[UIImage imageNamed:] 方法,它不需要全路径,只需要文件名即可。
我宁愿编写一些自动化脚本,而不是使用XCode完成这样的任务!
http://developer.apple.com/tools/xcode/automatorforxcode.html
编写代码以允许外部配置文件完成大部分设置,然后在目标中包含正确的资源。使用一个项目为每个客户端创建一个新目标,您可以选择将哪些资源包含在每个目标中。如果您在处理多个目标时遇到问题,可以使用git来管理核心项目,然后为每个客户端创建一个分支。
我会为客户创建一个设置界面,让他们能够根据自己公司/个人的需求来自定义应用程序。例如,从他们的照片库提供图片等。
您可以为每个客户创建一个项目,并将所有源文件包含在同一路径中,而无需将它们复制到项目目录中。 因此,在使用相同的代码库的同时,您将能够替换项目中的图标/启动画面。 这似乎是迄今为止最简单的方法。