0

我正在通过构建一个与 PHP/MySQL api 对话的小型应用程序来学习 obj-c 的项目。

每次用户做某事时,都会为该用户设置一个新的 auth-key 并发送给客户端。客户端接收到这个值并且应该将它设置为 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)未设置 auth-key 值(在 NSUserDefaults 中)
2)我尝试登录用户,设置值(如“aaaaaaaaaaaaaaaa”),一切都很好。我重新启动程序,它使用这个存储的值,尝试登录,从 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 中作为第一行,但它没有帮助。

就像它设置了一样,然后无论如何都被遗忘了......我做错了什么?

4

1 回答 1

5

NSUserDefaults设置值时不会将更改写入文件。它会定期这样做,偶尔一次。如果您希望它立即将更改保存到磁盘,您应该同步它:

[[NSUserDefaults standardUserDefaults] setObject:Value forKey:Name];
[[NSUserDefaults standardUserDefaults] synchronize];
于 2012-11-21T22:24:12.880 回答