我目前正在将现有的iOS应用程序调整为一系列非常相似的应用程序(每个应用程序实例可能会映射到不同的国家/地区)。
我打算为每个实例设置不同的构建目标,它们之间的唯一区别应该是:
代码本身应该在所有应用上都相同。
我想知道的是您认为管理这类应用程序的最佳做法。
关于图像和本地化(或一般资源),它应该只是从目标添加/删除适当的文件(我想我甚至可以在不同的目录中使用相同的名称)。< / p>
我不确定的主要是其他配置变量。
我听说过/想过几个选择:
我认为第一个选项是一旦我有这个应用程序的几个实例就失控了,加上我每次更改其中一个设置时都要重新编译。
第三个选项我也不确定,因为我将在我的数据库中添加实体,这些实体并不觉得它们属于那里,再加上它有点像过度杀戮可能是5-10个设置。我也不确定如何在更新时添加新设置。
所以我更倾向于第二种选择。
思考?这些的替代品吗?
更新#1:
关于第二个选项,还有一个缺点是,这些字符串(ID,URL等)会稍微暴露(即,如果有人打开应用程序并查看plist),而不是它们在源中码。并不是说这是一个很大的问题,而是需要考虑的事情。
更新#2:
如何直接使用应用程序的info.plist并将其存储在那里? (因此每个目标配置都有一个info.plist)尽管我最初想的是有一个单独的plist,并且有一个“配置单例”可以从启动时加载所有内容,我认为简单地拥有它可能更简单在info.plist中,然后通过[[[NSBundle mainBundle] infoDictionary] objectForKey:@"com.example.mykey1"]
阅读。
答案 0 :(得分:4)
我会选择预处理器选项。您可以将所有预处理器放在一个文件/方法中,它不会太乱。就像oefe所说,改变.sqlite是有点过分的。使用多个plist,你会发现自己拖着东西并做很多容易出错的动作。
然而,我不会制作很多应用。我只想制作一个应用程序,让用户在启动时选择他的城市。您还可以添加应用内购买,以便用户在需要时添加更多城市。
答案 1 :(得分:2)
我最终选择了plist,但是我没有创建一个新的,而是使用了info.plist文件,因此不需要为每个目标添加额外的文件,因为我已经需要为每个目标单独使用info.plist一。我只是直接从捆绑中加载它们:
[[[NSBundle mainBundle] infoDictionary] objectForKey:@"com.example.mykey1"]
我还使用了预处理器(在目标设置上设置了标志),但这主要是因为当我想完全禁用/删除应用程序的某些部分时(例如,确保我得到了所有我评论过的内容)输出枚举值,甚至包含在几个地方)。
我认为它相对干净,我可以很容易地将其复制到未来的版本中而不会造成太多混乱。
答案 2 :(得分:1)
鉴于每个国家/地区的变化,并且这些变量是字符串,为什么不简单地将它们视为可本地化的字符串,从而将问题减少到已经解决的问题?
否则,我会去找那个人。 Sqlite似乎是一种矫枉过正,并不是源代码控制友好的。并且条件编译会很快变得混乱。