管理一系列相关iOS应用程序的最佳实践

时间:2011-04-04 19:00:47

标签: iphone objective-c ios configuration-management

我目前正在将现有的iOS应用程序调整为一系列非常相似的应用程序(每个应用程序实例可能会映射到不同的国家/地区)。

我打算为每个实例设置不同的构建目标,它们之间的唯一区别应该是:

  • 图片(可能只是闪屏和图标)
  • 本地化
  • 字符串变量:远程服务的基本URL,应用程序ID,支持电子邮件等(可能有六个这样的变量)

代码本身应该在所有应用上都相同。

我想知道的是您认为管理这类应用程序的最佳做法。

关于图像和本地化(或一般资源),它应该只是从目标添加/删除适当的文件(我想我甚至可以在不同的目录中使用相同的名称)。< / p>

我不确定的主要是其他配置变量。

我听说过/想过几个选择:

  • 使用预处理器宏和具有不同URL,ID等的主配置头文件
  • 每当应用程序启动时从plist(或类似的配置文件)加载它们,并且每个目标都有一个这样的文件
  • 创建一个空的.sqlite文件(此应用已使用Core Data)并使用默认配置变量填充它,并为每个目标设置一个此类文件

我认为第一个选项是一旦我有这个应用程序的几个实例就失控了,加上我每次更改其中一个设置时都要重新编译。

第三个选项我也不确定,因为我将在我的数据库中添加实体,这些实体并不觉得它们属于那里,再加上它有点像过度杀戮可能是5-10个设置。我也不确定如何在更新时添加新设置。

所以我更倾向于第二种选择。

思考?这些的替代品吗?

更新#1:

关于第二个选项,还有一个缺点是,这些字符串(ID,URL等)会稍微暴露(即,如果有人打开应用程序并查看plist),而不是它们在源中码。并不是说这是一个很大的问题,而是需要考虑的事情。

更新#2:

如何直接使用应用程序的info.plist并将其存储在那里? (因此每个目标配置都有一个info.plist)尽管我最初想的是有一个单独的plist,并且有一个“配置单例”可以从启动时加载所有内容,我认为简单地拥有它可能更简单在info.plist中,然后通过[[[NSBundle mainBundle] infoDictionary] objectForKey:@"com.example.mykey1"]阅读。

3 个答案:

答案 0 :(得分:4)

我会选择预处理器选项。您可以将所有预处理器放在一个文件/方法中,它不会太乱。就像oefe所说,改变.sqlite是有点过分的。使用多个plist,你会发现自己拖着东西并做很多容易出错的动作。

然而,我不会制作很多应用。我只想制作一个应用程序,让用户在启动时选择他的城市。您还可以添加应用内购买,以便用户在需要时添加更多城市。

  • 您的应用程序将更易于维护:您是否希望在每次更新时上传,更改10多个应用程序的说明和屏幕截图?我发现1个应用程序很痛苦......
  • 你不会向AppStore发送垃圾邮件:在AppStore中有超过10个以上的应用具有完全相同的目的是荒谬的......这正是苹果公司为了避免这种情况而进行应用内购买的原因。
  • 您必须为每个城市找到不同的图标:在AppStore上销售您的应用时,您的图标是最重要的方面之一。你希望它尽可能地抛光。 Apple不会允许多个应用程序拥有相同的图标,并通过在其上添加标签来区分图标 not 是一个不错的选择。

答案 1 :(得分:2)

我最终选择了plist,但是我没有创建一个新的,而是使用了info.plist文件,因此不需要为每个目标添加额外的文件,因为我已经需要为每个目标单独使用info.plist一。我只是直接从捆绑中加载它们:

[[[NSBundle mainBundle] infoDictionary] objectForKey:@"com.example.mykey1"]

我还使用了预处理器(在目标设置上设置了标志),但这主要是因为当我想完全禁用/删除应用程序的某些部分时(例如,确保我得到了所有我评论过的内容)输出枚举值,甚至包含在几个地方)。

我认为它相对干净,我可以很容易地将其复制到未来的版本中而不会造成太多混乱。

答案 2 :(得分:1)

鉴于每个国家/地区的变化,并且这些变量是字符串,为什么不简单地将它们视为可本地化的字符串,从而将问题减少到已经解决的问题?

否则,我会去找那个人。 Sqlite似乎是一种矫枉过正,并不是源代码控制友好的。并且条件编译会很快变得混乱。