2012-08-12 59 views
3

我是.Net開發人員,對Xcode非常新穎。我正在使用WCF服務器端進程,並在iphone應用程序和WCF之間發送/接收JSON數據。我想原生iPhone應用程序,下面做:iOS:將驗證數據永久存儲在設備上

  1. 註冊並登錄查看
  2. 一旦用戶點擊登錄按鈕,它發送的用戶名和密碼JSON格式輸入到我的WCF服務進行身份驗證,如果登錄是有效的, WCF將返回一個有效的成員GUID和一個令牌字符串iPhone應用程序接收成員GUID和令牌,並將它們存儲在「持久變量」中,並且我將爲經過身份驗證的用戶加載新視圖。所以成員可以訪問所有的功能/視圖。
  3. 我每次發佈iphone應用程序和WCF之間的數據時,都需要使用該成員的guid和變量中的標記,以便WCF服務知道哪個成員正在請求數據。
  4. 每次用戶關機或重新啓動iphone,我希望我的應用程序可以記住成員guid,所以他們不必再次登錄。
  5. 用戶可以單擊一個註銷按鈕,它將清除該變量並返回到登錄視圖。

我不確定這是iPhone應用程序登錄過程的正確方法嗎?

我已經完成了WCF身份驗證併發送回JSON,但現在我需要存儲成員GUID,有人可以請我指出正確的方向嗎?我應該使用什麼來存儲稍後可以使用的信息?一個例子會很棒!

回答

5

聽起來像NSUserDefaults的完美類型。他們使用像這樣的:

NSUserDefaults *myUserDefaults = [NSUserDefaults standardUserDefaults]; 
[myUserDefaults setObject: @"the key" forKey: @"key"]; 

您也可以使用其他功能來設置不同的數據類型的,像setInteger:forKey:setValue:forKey:。要回收您的數據,請使用此功能:

NSString *theKey = [myUserDefaults objectForKey:@"key"]; 

並且返回值將是您存儲在其中的對象。其他數據類型的功能類似於integerForKey:valueForKey:

+0

這是正是我需要爲我的應用程序。不幸的是,我進入並使用核心數據創建了一個自定義解決方案。 TODO:遷移現有代碼以使用NSUserDefaults。 – Brian 2012-08-12 01:18:39

+0

感謝WolfLink,正是我需要的:) – paul1155 2012-08-12 02:17:02

4

您應該知道您必須尊重應用程序的沙箱,這意味着您不能在設備上「永久」存儲某些內容。

通常這種邏輯(儲存令牌等)是通過將該數據保存到NSUserDefaults中完成的。

NSUserDefaults是應用程序的屬性列表,您可以將數據存儲爲鍵值對。

您可以通過以下操作保存的東西,例如:

NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; 
[ud setObject:@"mylongtoken" forKey:@"com.myapp.apitoken"]; 
[ud synchronize]; 

如果您刪除的應用這一數據也將會消失。當應用程序通過App Store更新時,這些數據將保留下來,並將作爲設備備份的一部分備​​份到iTunes/iCloud。

您還可以使用iCloud的同步屬性列表,但對於皮斯看看這篇文章:Can I use iCloud to sync the NSUserDefaults plist file

+0

感謝您的回覆Daniel。永久性的,我的意思是當用戶關閉或重新啓動設備時保持這一數據,所以他們下次使用應用程序時不需要再次登錄。如果用戶選擇刪除應用程序,該數據應完全刪除我同意。 – paul1155 2012-08-12 02:16:31

1

其實,如果你存儲的憑據,你應該將其寫入一個鑰匙串。 NSUserDefaults可以很容易地從設備上加載,並保存在清除。

這裏是一個不錯的鑰匙串實用工具庫,應該是有幫助的: https://github.com/ldandersen/STUtils/tree/master/Security

您可以保存憑據,像這樣:

[STKeychain storeUsername:@"username" andPassword:@"password" forServiceName:@"namespace" updateExisting:YES error:&error]; 

然後像這樣進行檢索:

NSString *password = [STKeychain getPasswordForUsername:@"username" andServiceName:@"namespace" error:&error];