在构建时覆盖NSUserDefault首选项

时间:2015-07-08 01:24:09

标签: ios objective-c xcode plist nsuserdefaults

我希望能够在我的iOS项目中的构建时设置应用程序首选项。我知道我可以在xcode中创建不同的目标,但我认为我可能最终会在我的项目中最终得到一些噩梦般的目标。

一个简单的例子是为默认值“amount”设置一个默认整数。目前,'amount'在我的应用程序中名为'preferences.plist'的plist文件中定义。我加载了该plist文件,并在NSUserDefaults上使用该plist注册默认值。

NSURL *preferencesFile = [[NSBundle mainBundle] URLForResource:@"preferences" withExtension:@"plist"];
    NSDictionary *defaultPreferences = [NSDictionary dictionaryWithContentsOfURL:defaultPreferencesFile];
    [[NSUserDefaults standardUserDefaults]  registerDefaults:preferences];

我假设我可以在构建之前编写一个脚本来修改preferences.plist文件,然后构建它。但是,当我需要修改一系列不同的偏好时,我认为可能会成为一场噩梦。

结束游戏是让詹金斯建立我的IPA。我想轻松创建多个jenkins构建,这些构建将指向相同的代码但是使用不同的首选项构建我的应用程序。

Android具有风格,并且具有设置资源值的能力。 iOS有类似的东西可以用来构建这些不同的'风味'的应用程序吗?

2 个答案:

答案 0 :(得分:1)

我没有足够的Android工作经验。

我会用多个plist来解决这个问题..每种味道都有一个..

我将尝试以下任一选项 -

  1. 我会让詹金斯根据我想要建立的味道交换plist ..脚本将为给定的味道挑选合适的plist

  2. 我将为每种风格定义编译时MACROS并加载适当的plist ..这样的事情

    {{1}}

答案 1 :(得分:1)

我使用Jenkins构建操作在Xcode构建之前将适当的变量注入plist:

plutil -replace MyBuildBranch -string ${BRANCH} MyProj/MyProj-Info.plist

然后我在运行时使用类似的东西读取该值:

NSBundle * bundle = [NSBundle bundleForClass:[AppDelegate class]];
NSString * myBuildBranch = bundle.infoDictionary[@"MyBuildBranch"]