iOS 应用程序配置文件

36

在一个C#应用程序中,我通常使用app.config文件来保存一些数据,以便在需要时加载应用程序(例如连接字符串)。

在iOS应用程序中保存这样的信息,最好的方法是什么?

8个回答

58
您可以创建一个属性列表文件(在XCode中有一个模板,只需转到“文件” - >“新建文件”,然后选择),这样您就会得到类似于“settings.plist”或类似的内容。您可以将plist视为一个键=>值配置文件,其中的区别是除了纯文本作为值之外,还可以保存数组和字典。

使用NSBundle在应用程序中加载文件,例如

NSString *path = [[NSBundle mainBundle] pathForResource:@"settings" ofType:@"plist"];
NSDictionary *settings = [[NSDictionary alloc] initWithContentsOfFile:path];
你可以像使用普通字典一样访问你的键。只是不要忘记在结束时[释放]它。

2
如果fr33d0m是新手,他可能使用iOS 5,默认使用ARC(自动引用计数),如果是这种情况,请不要释放任何东西。 - Sergio Moura
是的,我会使用iOS 5。谢谢。 - António

10

对于像连接字符串这样的小数据,我会使用NSUserDefaults

当您想保存连接字符串时,可以执行以下操作:

[[NSUserDefaults standardUserDefaults] setObject:myConnectionString 
                                          forKey:@"connectionString"];

当您想要加载它时,您需要执行以下操作:

myConnectionString = [[NSUserDefaults standardUserDefaults] 
                          stringForKey:@"connectionString"];

4
使用NSUserDefaults时,第一次写入文件需要运行应用程序。我的目标是有一个文件,在常规编辑器上可以编辑内容,而无需运行应用程序(可能是因为我习惯于Windows上的app.config)。无论如何,谢谢您... - António

4
如果你只是存储一组相对简单的配置信息,你可以直接使用NSDictionary的序列化方法(我不知道如何链接到类文档中的方法目录):
NSString *settingsPath = [@"~/pathtoconfig.plist" stringByExpandingTildeInPath];

NSMutableDictionary *settings = [NSMutableDictionary dictionary];
if([[NSFileManager defaultManager] fileExistsAtPath:settingsPath]){
    settings = [NSMutableDictionary dictionaryWithContentsOfFile:settingsPath];
}

// writing settings
[settings writeToFile:settingsPath atomically:YES];

由于我不知道您对Objective-C的熟悉程度,因此我想指出:


1
iOS 5在Xcode中默认启用了自动引用计数。 - Sergio Moura
是的,我忘了那个了,虽然它不完美。如果我没记错的话,你仍然需要遵循编码标准并处理循环依赖关系。 - Jeff

2
在iOS中,每个应用程序都有自己的沙盒,只能为该应用程序提供可用性。因此,如果您希望将文件保存为只读访问,请将其保存到应用程序包中。否则,请保存到应用程序文件夹中。
无法直接访问应用程序文件夹,因此,如果要将文件保存到该文件夹中,则必须以编程方式执行此操作。

2

使用iOS 8.3Swift创建iOS应用程序配置文件:

    let path: String = NSBundle.mainBundle().pathForResource("Info", ofType: "plist")!
    let nsDictionaryInfoPlist: NSDictionary = NSDictionary(contentsOfFile: path)!

    // Usage example: Google Maps iOS SDK/API Configuration.
    GMSServices.provideAPIKey(nsDictionaryInfoPlist.objectForKey("GoogleMapsiOSAPIKey") as! String)

2

更新至Swift 3 Xcode 8

在项目中添加一个名为“Sample.plist”的新属性列表。然后查看以下示例。

    let path: String = Bundle.main.path(forResource: "Sample", ofType: "plist")!
    let sampleConf: NSDictionary = NSDictionary(contentsOfFile: path)!
    print(sampleConf.object(forKey: "test") as! String)

1

0

我意识到我来晚了,但在找到这个堆栈溢出后,我对接受的答案感到沮丧,所以我创建了一个 pod 来解决它! 这是基于 @RafaelSteil的 答案 的想法,但它具有更简单的界面,缓存加载的配置数据,并支持提供自己默认值的 pods ,可以被主应用程序覆盖。 我希望它能帮助到某些人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接