10

我想使用自动登录功能。因此,当用户打开应用程序时,他会被委派到“登录屏幕”。当他成功登录时,他应该被引导到他的帐户。我称之为“帐户屏幕”。现在,当用户重新启动应用程序时,他应该直接转到他的帐户,而不会看到“登录屏幕”。

登录功能在我的项目中已经可以正常工作(用户名和密码保存在 UserDefault 中),但是每次关闭应用程序时,我都必须重新登录。所以我的问题是:如何自动登录用户?或者更好的说法是:如何检查数据(保存在 UserDefault 中)是否与数据库(MYSQL)中的相同?

4

4 回答 4

23
  1. 当用户第一次登录时,您将用户凭据保存在 iPhone 的钥匙串中。
  2. 再次打开应用程序时,您检查钥匙串中是否存在用户凭据,如果是,您的代码应调用登录逻辑并执行自动登录并在登录屏幕后转到屏幕。如果没有,那么您应该显示登录屏幕。您可以在 AppDelegates applicationDidFinishLaunching 中执行此逻辑。
  3. 每当用户单击注销按钮时,首先从钥匙串中删除用户凭据,然后返回登录控制器。

只需在用户登录时将登录凭据添加到钥匙串,并且仅在用户单击注销按钮后将其删除。如果用户在未注销的情况下退出应用程序,则凭据仍将位于钥匙串中,您可以在用户返回应用程序时检索它们。

编辑: 我想我必须再添加一件事。如果您的登录逻辑需要时间(例如您使用 Web 请求或其他方式登录),请将登录逻辑代码放在您的 Login ViewController 而不是 ApplicationDelegate 中,并在自动登录期间使用任何活动指示器过程。

编辑:我编辑了整个答案,用钥匙串替换了 NSUserDefault。这个线程解释了原因。

于 2012-04-24T12:06:55.463 回答
2

在保存用户名和密码时,强烈建议保存在 Keychain 而不是 NSUserDefaults 中。参考这篇文章以获得更好的理解。

于 2012-04-24T18:03:44.217 回答
0

要回答这个问题:如果您想使用钥匙串数据自动登录,请使用免费框架“SFHFKeychainUtils”。它将用户名、密码和服务名保存在钥匙串中。如果您想找回它,只需将用户名保存在 NSUserDefaults 中,您就可以轻松获取密码。

开始了:

SiFi HiFi 框架: https ://github.com/ldandersen/scifihifi-iphone/tree/master/security

SiFi Hifi 框架(ARC 兼容): https ://stackoverflow.com/a/10348964/1011125

如何使用 SFHFKeychainUtils: http ://gorgando.com/blog/technology/iphone_development/simple-iphone-tutorial-password-management-using-the-keychain-by-using-sfhfkeychainutils

于 2012-05-07T09:32:25.720 回答
0

我使用了 NSUserDefaults 和 SSKeychain 的组合。我使用 NSUserDefaults 来存储用户名和 SSKeychain 来存储密码。

这是我用来保存凭据的代码

NSString *user = self.username.text;
NSString *password = self.pass.text;
[SSKeychain setPassword:password forService:@"achat" account:user];
NSUserDefaults *dUser = [NSUserDefaults standardUserDefaults];
[dUser setObject:user forKey:@"user"];
[dUser synchronize];

这是我用来检索凭据的代码

NSUserDefaults *eUser = [NSUserDefaults standardUserDefaults];
NSString *savedUser = [eUser objectForKey:@"user"];

    if (!savedUser) {
        UIAlertView *uhoh = [[UIAlertView alloc] initWithTitle:@"Oops!" message:@"Please enter your username and password." delegate:self cancelButtonTitle:@"Okay" otherButtonTitles:nil, nil];
        [uhoh show];
    }

    else {
            NSString *savedPass = [SSKeychain passwordForService:@"achat" account:savedUser];
            self.username.text = savedUser;
            self.pass.text = savedPass;
         }
于 2013-09-15T17:27:19.090 回答