保留多个用户(NSUserDefaults,XML文件或数据库)首选项的最佳方法

时间:2013-09-26 08:51:01

标签: ios objective-c

我正在创建一个iOS应用程序,可以管理用户并登录。

我想保留每个用户的用户数据设置,但我不确定每个用户保存此设置的最佳方法是什么。

我应该将数据保存到xml文件,还是NSUserDefaults,甚至将它们保存到我的Parse Cloud数据库中?

我只想在加载视图时保存用户属性列表,但我必须考虑到我的应用必须为当前用户加载正确的参数。

例如:

用户:彼得 trackingSwitchEnabled:是

用户:莫莉 trackingSwitchEnabled:NO

用户:保罗 trackingSwitchEnabled:是

4 个答案:

答案 0 :(得分:10)

  • 除非您要存储敏感信息,否则请勿使用钥匙串。
  • 不要使用核心数据或XML(除非它是一个plist),因为它需要做很多工作。
  • 除非您有理由,否则不要使用Parse,因为您的用户数据将取决于您为帐户付款以及用户是否具有连接性。
  • 将NSUserDefaults与key = user,value = JSON字符串一起使用。您可以将其解析为/从对象解析。
  • 如果您非常懒,请使用复合密钥,例如:key =“Mary | tracking”,value = YES。

Bonus ASCII art!

                           NSUserDefaults   plist    Core Data   SQList
    Full text search           ✘              ✘          ✘         ✔
    Complex search             ✘              ✘          ✔         ✔
    Binary data                ✘              ✘          ✔         ✔
    Allows complex data        ★              ★★        ★★★★     ★★★★
    Performance                ★              ★         ★★★      ★★★★
    Learning curve             ★              ★★        ★★★      ★★★★

答案 1 :(得分:0)

这是一个很好的应用程序首选项和设置指南。

About Preferences and Settings

简而言之,你应该使用NSUserDefaults。

答案 2 :(得分:0)

使用NSUserDefault不是保存用户登录详细信息的好主意。 最好使用动态plist 或xml。 请阅读this以获得更好的方法。

答案 3 :(得分:0)

为了保存用户凭据,我建议使用apple中的KeychainItemWrapper类:

您可以使用它来保存这样的值(例如使用电子邮件/密码textFields)

        KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"myAppLogin" accessGroup:nil];        
        [keychainItem setObject:txtPassword.text forKey:(__bridge id)(kSecValueData)];
        [keychainItem setObject:txtEmail.text forKey:(__bridge id)(kSecAttrAccount)];
        }

然后,当你想从钥匙串中取回价值时,你只需:

        KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"myAppLogin" accessGroup:nil];
        NSMutableDictionary *myDictionary = [[NSMutableDictionary alloc]init];
        [myDictionary setObject:[keychainItem objectForKey:(__bridge id)(kSecAttrAccount)] forKey:@"email"];
        [myDictionary setObject:[keychainItem objectForKey:(__bridge id)(kSecValueData)] forKey:@"password"];

另外,不要忘记从我发布在顶部的developer.apple.com链接下载KeychainItemWrapper.h和.m。

所以是的,基本上解释了史蒂夫说的话:)。