2012-11-21 7 views
0

저는 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];  
} 

거의 작동합니다.
[인증 키 값이() 나는 "aaaaaaaaaaaaaaaa"(같은 사용자 값 세트를 로그인하려고)
2) NSUserDefaults에서 설정되지 않고

1) 모든 것이 잘 :
문제는 이런 식입니다 . 프로그램을 다시 시작하고,이 저장된 값을 사용하고, 로그인을 시도하고, 응답을 반환 할 때 설정해야하는 새 키와 함께 PHP에서 긍정적 인 결과를 얻습니다. ...

3) 위의 NSLog는 "TRY SET KEY : bbbbbbbbbbbbbbbbb"및 "TRY GET KEY : bbbbbbbbbbbbbbbbb"라고 표시합니다. 완벽 하 게 찾고!
4) 좋아요, 프로그램을 죽이고 다시 시도합니다. 이제 "bbb ..."가 저장되어 있어야합니다. 맞습니까? 잘못된! 지금 NSLogs이 값은 여전히 ​​"aaa ..."입니다.
5) 로그인을 다시 시도하면 NSLog는 "TRY SET KEY : ccc ..."와 "TRY GET KEY : ccc ..."라는 메시지를 표시합니다. 이 값은 저장된다고합니다. 하지만 그렇지 않습니다 ...
6) 프로그램을 죽이고, 재시작하여 "aaa ..."를 얻습니다.
7) 저는 AppDelegate에서 "xxx"와 같은이 값을 (같은 기능으로) 수동으로 설정합니다. 프로그램을 실행하고 "xx"와 같은 키를 설정합니다. 이 줄을 지우고 프로그램을 다시 시작하면 "xxx"가 제대로 저장되고 이제는 # 2로 돌아갑니다. 하나의 로그인을 할 수 있습니다,이 값을 올바르게 저장 한 다음 하나의 자동 로그인을 할 수 있지만 그 로그인에 대한 저장을 중지합니다 ...

그래서, 무엇이 잘못 되었습니까? 나는 SetValue에서 첫 번째 라인으로 [[NSUserDefaults standardUserDefaults] removeObjectForKey:Name];을 시도했지만 도움이되지 않습니다.

어쨌든 나는 잊어 버리고 잊어 버린 것 같은데 ... 내가 뭘 잘못하고있는거야?

답변

4

NSUserDefaults 값을 설정하는 순간 파일에 변경 사항을 기록하지 않습니다. 주기적으로 그렇게합니다. 변경 사항을 즉시 디스크에 유지하려면 동기화해야합니다.

[[NSUserDefaults standardUserDefaults] setObject:Value forKey:Name]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 
+0

그 트릭을 수행했습니다! 감사! – gubbfett

+0

@gubbfett 문제가 없습니다. 당신이 그렇게 할 수있을 때 제 대답을 받아주십시오. (힌트 : 약간의 인터넷 검색이이 솔루션을 가져 왔을 것입니다 ...) –

+0

앱이 정상적으로 종료되면이 작업이 일반적으로 수행됩니다. 앱을 강제 종료하거나 충돌이 발생하면 앱이 동기화되지 않을 수 있습니다. 그리고 나는 당신의 테스트에서 추측하고 있습니다. 당신은 앱을 우아하게 멈추지 않았습니다. 현실 세계에서는 이것이 문제가되지 않습니다. –