iOS应用程序配置文件

iOS Application Configuration File

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

在iOS应用程序中保存此类信息的最佳方法是什么?


您可以创建一个属性列表文件(Xcode中有一个模板,只需到file->new file并选择那里),这样您就可以得到类似于"settings.plist"的文件,或者类似的文件。您可以将plist看作是一个key=>value配置文件,不同的是,除了纯文本作为值之外,您还可以保存数组和字典。

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

1
2
NSString *path = [[NSBundle mainBundle] pathForResource:@"settings" ofType:@"plist"];
NSDictionary *settings = [[NSDictionary alloc] initWithContentsOfFile:path];

然后您可以作为常规字典访问您的密钥。只是不要忘记在;)之后释放它。


对于连接字符串之类的小数据位,我将使用nsuserdefaults。

当您想保存连接字符串时,可以这样做:

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

当你想加载它时,你可以这样做:

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


如果您只是存储一组相对简单的配置资料,那么您可以简单地使用nsdictionary的序列化方法(我不知道如何链接到class doc中的methods目录):

1
2
3
4
5
6
7
8
9
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有多熟悉,我还要注意:

  • 在iOS中,主目录是指应用程序的沙盒目录。
  • 我建议在参考计数上多读一点。虽然objective-c,从ios5开始,现在自动为您计算引用计数,但是有一些边缘情况需要注意(这里有一个关于arc的问题)。


为Swift 3 Xcode 8更新

将新的属性列表添加到名为"sample.plist"的项目中。然后看下面的例子。

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

iOS应用程序配置文件,采用iOS 8.3的swift格式:

1
2
3
4
5
    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)

在iOS中,每个应用程序都有自己的沙盒,只能用于该应用程序。因此,如果您希望该文件是只读的,请将其保存到应用程序包中。否则保存到应用程序文件夹。

不能直接访问应用程序文件夹,因此如果要将文件保存到该文件夹,必须以编程方式进行。


我使用属性列表来存储小数据块-请在此处查看如何使用它们:

http://iphoneencator.com/blog/tag/nspropertylistserialization


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