我正在通過構建一個適用於PHP/MySQL API的小應用程序來學習obj-c的項目。NSUserDefaults,不可靠?
每次用戶執行某項操作時,都會爲該用戶設置一個新的授權密鑰併發送給客戶端。客戶端收到此值並將其設置爲NSUserDefaults。這是爲了不讓用戶在每次程序啓動時都登錄;如果此密鑰存在,它將嘗試使用此密鑰進行身份驗證,然後自動登錄。
這有效,有時候...我有兩個功能,一個用於接收和一個用於設置。他們看起來像這樣:
//GET
-(NSString*)GetValue:(NSString *)Name
{
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSString *get = [prefs stringForKey:Name];
if(get)
return get;
else
return FALSE;
}
//SET
-(void)SetValue:(NSString*)Name:(NSString*)Value
{
//Add new...
[[NSUserDefaults standardUserDefaults] setObject:Value forKey:Name];
}
這個工程,差不多。
問題是這樣的:
1)(在NSUserDefaults的)
2)我嘗試登錄的用戶,值集(如「aaaaaaaaaaaaaaaa」)中的auth-鍵值沒有設置和一切都很好。我重新啓動程序,它需要這個存儲的值,嘗試登錄,從PHP返回一個積極的結果以及一個新的密鑰,必須在答案返回時設置...像這樣...
if(NewKey.length > 0)
{
NSLog(@"TRY SET KEY: %@", NewKey);
[self SetValue:@"auth_key":NewKey];
NSLog(@"TRY GET KEY: %@", [self GetValue:@"auth_key"]);
}
3)上面的NSLog說「TRY SET KEY:bbbbbbbbbbbbbbbb」和「TRY GET KEY:bbbbbbbbbbbbbbbb」。看起來完美!
4)很好,我殺了程序並再次嘗試,現在它應該存儲「bbb ...」,對不對?錯誤!當我現在NSLogs這個值,它仍然是「aaa ...」
5)我再次嘗試登錄,NSLog說:「TRY SET KEY:ccc ...」和「TRY GET KEY:ccc ...」 - 它說這個值被存儲。但它不是...
6)我殺了程序,重新啓動並獲得「aaa ...」。
7)我殺了程序,在AppDelegate我手動設置這個值(具有相同的功能)喜歡「xxx」。我運行該程序,它將鍵設置爲「xx」。我刪除這行,重新啓動程序,「xxx」被正確存儲,現在我又回到了#2;我可以做一個登錄,它正確存儲這個值,然後我可以做一個自動登錄,但在該登錄時,它會停止保存它...
那麼,這裏有什麼問題?我試過[[NSUserDefaults standardUserDefaults] removeObjectForKey:Name];
作爲SetValue的第一行,但它沒有幫助。
這就像它設置,然後beeing無論如何被遺忘......我做錯了什麼?
這樣做的竅門!謝謝! – gubbfett
@gubbfett沒問題。請儘可能接受我的答案。 (提示:btw有點谷歌會提出這個解決方案......) – 2012-11-21 22:28:51
我認爲這通常是爲你完成的,當你的應用程序正常退出。如果您強制應用程序退出,或者它崩潰,它可能永遠不會同步。我在測試中猜測,你沒有優雅地停止應用程序。在現實世界中,這不是一個問題。 –