2013-04-11 82 views
3

我不希望我的應用在啓動後立即要求登錄。相反,我想提醒用戶以「每個需要」爲基礎登錄。因此,例如,如果用戶與需要他登錄的部分應用程序進行交互,那麼只有登錄提示符纔會出現。如何處理懶惰登錄?

我有幾個問題:

1)有沒有人做過這種「懶惰」登錄前,如果有什麼你的經驗了?管理是否尷尬?這對用戶來說是一種令人困惑的體驗嗎?

2)什麼是最好的實施方式?

我有一個提示用戶登錄一個LoginViewController。我希望以當前可見的視圖控制器視圖的頂部顯示該視圖控制器。

我也像其他各種視圖控制器一無所知的LoginViewController,以儘量減少耦合。

理想我有一些LoginManager單這將管理任何與登錄。

再比如說,如果MyCoolViewController需要用戶驗證有一定的功能,就像一個按鈕,一些隨機的視圖控制器被按下時,可以調用:

- (void)buttonPressed:(id)sender { 
    // If the user isn't logged in, show the login modal view on top of this VC 
    if (![[LoginManager sharedManager] requireLoginWithViewController:self]) { 
     return; 
    } 

    // Code that is protected by login 
} 

但是,然後我需要一種方法來知道登錄是否成功。這可以通過委託或回調來解決,但意味着視圖控制器都知道一些我想避免的LoginController。

另一種方法是創建的UIViewController的ProtectedViewController子類,所有我的視圖控制器將子類,並會在需要時訪問受保護的功能,並且呈現所述登錄控制器提供的功能性。

您如何看待這些方法?還有什麼更有意義嗎?我很想聽聽你有關「懶惰」登錄的體驗。

+0

這似乎是一個有效的實現。只要確保沒有任何東西不會讓身份盜用者看到:) – Undo 2013-04-11 20:37:04

+0

您是否需要讓他們註冊? – 2013-04-11 20:40:49

回答

0

我最終選擇了一個隱藏網絡管理器用戶登錄細節的實現,同時仍然不知道登錄實現細節。

我用3類實現此:

  • 網絡管理器(單例接口到web服務)
  • LoginManager(單登錄協調器)
  • LoginViewController(VC,以顯示登錄界面如登錄按鈕)

NetworkManager有一個loginDelegate,它負責處理特定於應用程序的登錄UI。在這種情況下,LoginManager單例就是這個loginDelegate。

的一般流程是:從服務器通過NetworkManager的

    1. 的應用程序請求數據如果請求驗證失敗,NetworkManager的道出了loginDelegate,它現在應該處理某種登錄流程。
    2. LoginManager然後在窗口的rootViewController上以模態方式呈現一個LoginViewController。
    3. 當按下登錄按鈕時,LoginViewController會通知LoginManager它要登錄。
    4. LoginManager反過來使用NetworkManager執行實際的服務器登錄。
    5. 登錄完成後,通過回調塊通知LoginManager。如果成功,LoginViewController將被解僱。

    有一點來回的LoginManager和LoginViewController之間,但是這使得網絡管理器,而無需對登錄流程知識的消耗。此外,NetworkManager可以在其他應用程序中重用,因爲它對應用程序特定的登錄視覺效果一無所知(因此需要委託)。

    代表團通常不使用單身,但我認爲這是在這種情況下確定,因爲那裏應該永遠只能是一個登錄代表(理論上應該有在應用程序登錄一個流量)。

    這是第一種方法,可能會隨着時間而改進。也許使用通知來通知用戶登錄的應用程序的其餘部分可能是下一個好的步驟。

  • 0

    我不得不實施懶日誌上通過以下方法這個方法(沒有問題):

    1. 創建一個設置與註銷,登錄(用戶名/密碼)查看,也可以是一般的登錄頁面,或一個UIWebView。
    2. 應用程序將數據發送到服務器進行身份驗證(在JSON消息中)。
    3. SUCCES登錄:我存儲在鑰匙串的登錄數據(使用單例模式,請參閱this Apple sample codethis tutorial
    4. 如果用戶想要使用的應用程序的一個敏感的部分,我請求所存儲的用戶名的密碼,並能夠註銷並以不同的帳戶登錄。該應用程序將輸入的密碼與存儲的密碼進行比較(離線模式)或將其發送到服務器(在線連接)。但可以根據要求以不同的方式實施。

    喜歡它的用戶!

    祝你好運!

    0

    您的問題已經包含大部分答案。也就是說,你應該去單身人士登錄管理器。我想實現登錄是這樣的:

    - (void)buttonPressed:(id)sender { 
        // If the user isn't logged in, show the login modal view on top of this VC 
        if ([[LoginManager sharedManager] requiresLogin]) { 
    
         [[LoginManager sharedManager] loginWithViewController:self completion:^{ 
          [self buttonPressed:sender]; 
         }]; 
    
         return; 
        } 
    
        // Code that is protected by login 
    } 
    

    通過這種方式,您的登錄管理仍然是匿名的,異步的登錄管理器可以恢復它離開的地方,爲用戶登錄操作。

    +0

    有道理,但我決定不採用這種方法,因爲我不希望應用程序的許多不同部分必須單獨處理登錄檢查和流程。 – nebs 2013-04-13 22:15:33