2012-04-24 104 views
10

我想使用自动登录功能。所以当用户打开应用程序时,他会被委派到“登录屏幕”。当他登录成功时,他应该被引导到他的账户。我称之为“账户屏幕”。现在,当用户重新启动应用程序时,他应该直接进入他的账户,而不会看到“登录屏幕”。iOS:如何在登录后认证用户(用于自动登录)?

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

+2

我不知道你正在尝试问代码... – BastiBen 2012-04-24 09:53:44

+0

只需在UserDefaults中设置一个可能被称为“登录”BOOL的标签,然后在应用时检测到 – adali 2012-04-24 09:53:59

+1

,因为您将登录信息存储在userDefaults中,请检查这些信息是否存在以及如果不存在登录屏幕? – 2012-04-24 09:54:43

回答

0

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

这里,我们去:

SIFI高保真框架:https://github.com/ldandersen/scifihifi-iphone/tree/master/security

SIFI音响框架(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

+0

在发布多个问题的复制和粘贴样板/逐字回答时要小心,这些问题往往会被社区标记为“垃圾”。如果你这样做,那么它通常意味着问题是重复的,所以标记它们。 – Kev 2012-05-07 11:26:04

+0

好的,谢谢。下次我会记住它.. – filou 2012-05-07 15:05:39

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

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

编辑:我想我一定多加一个thing..If登录逻辑需要一定的时间(如你登录使用web请求或东西),把登录逻辑代码在你登录的ViewController而不是ApplicationDelegate和使用自动登录过程中的任何活动指示器。

编辑:我编辑了整个答案,用Keychain替换了NSUserDefault。 This线程解释了原因。

+0

非常感谢你这个明确的答案。 “登录逻辑”是什么意思? – filou 2012-04-24 17:45:35

+1

@SaschaWieland如果您的登录需要任何网络请求/响应,那么这需要时间。通过登录逻辑,我只是​​指实际的登录过程。 – Krishnabhadra 2012-04-25 03:28:54

2

保存用户名和密码时,强烈建议保存在Keychain而不是NSUserDefaults中。请参阅此post以获得更好的理解。

+0

我使用钥匙串,但你能告诉我如何与钥匙串数据自动登录吗?从自动登录的链中获取数据非常繁重.. – filou 2012-04-24 18:09:32

+0

我假设你使用web服务来首次验证用户名密码。在每次连续启动时,从您的钥匙串中选择用户名和密码,并使用相同的Web服务对用户进行身份验证。在进行身份验证时,您可以显示加载屏幕以通知用户。 – Roshit 2012-04-24 18:13:25

+0

如果您使用代码'[keychainItem setObject:@“password forKey:kSecValueData]将详细信息设置为钥匙串; [keychainItem setObject:@“username”forKey:kSecAttrAccount];',那么你可以使用'NSString * password = [keychainItem objectForKey:kSecValueData]; NSString * username = [keychainItem objectForKey:kSecAttrAccount];' – Roshit 2012-04-24 18:15:13

0

我用了N的组合SUserDefaults和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; 
     }