2011-11-18 70 views
33

C#應用程序我總是使用一個app.config文件來保存一些數據,以便我的應用程序在需要時加載(例如連接字符串)。iOS應用程序配置文件

什麼是在iOS應用程序中保存此類信息的最佳方式?

回答

57

您可以創建一個屬性列表文件(有針對Xcode的模板,只是到文件 - >新文件,並選擇那裏),所以你會有像「settings.plist」,或類似的東西。你可以將plist想象成一個key =>值配置文件,不同之處在於除了純文本之外,你還可以保存數組和字典。

使用一個NSBundle將文件加載在你的應用程序,像

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

然後,您可以訪問你的鑰匙作爲一個普通的字典。只是不要忘了在[release]之後;)。

+2

如果fr33d0m是新的,他可能使用iOS 5,默認使用ARC(自動引用計數),如果是這樣的話,不要發佈任何東西。 –

+0

是的,我會用iOS 5.謝謝。 – Freedom

+0

是的,謝謝你記住ARC,Sergio。 –

2

在iOs中,每個應用都有自己的沙箱,只有該應用纔可用。所以如果你想讓這個文件只讀取,請將它保存到Application Bundle中。否則保存到Application文件夾。

你無法直接訪問應用程序文件夾所以,如果你想保存你的文件到該文件夾​​,你必須以編程方式進行。 -

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]; 

因爲我不知道如何熟悉你是與客觀C,我還要注意:

+1

iOS 5自動引用計數,並在Xcode中默認啓用。 –

+0

的確,我忘記了這一點,儘管它並不完美。 IIRC,你將不得不遵循編碼標準,處理循環依賴依然存在。 – Jeff

10

對於像連接字符串這樣的小數據,我會用NSUserDefaults

當要保存您的連接字符串,你可以這樣做:當你想加載它

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

,你可以這樣做:

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

隨着NSUserDefaults,我第一次寫入文件,我需要運行該應用程序。我的目標是有一個文件,我可以在常規編輯器上編輯內容,而無需運行應用程序(可能我想這樣做是因爲我習慣了windows上的app.config)。不管怎麼說,還是要謝謝你... – Freedom

2

的iOS應用程序配置文件在SwiftiOS 8。3

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) 
0

我意識到我遲到了,但要找到這個堆棧溢出我是在接受的答案心灰意冷之後,所以我created a pod解決吧!這是基於@ RafaelSteil的answer的想法,但它具有更簡單的接口,緩存加載的配置數據,並且它支持提供它們自己的默認值的主機,它們可以被主應用覆蓋。我希望它能幫助別人。

0

更新了斯威夫特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)