2012-04-24 98 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; 
     }