如何处理懒惰登录?(该问题涉及IT技术)

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的东西,我希望避免这种情况。 另一种方法是创建ProtectedViewController作为UIViewController的子类,所有的视图控制器都将继承该类,并提供访问受保护功能的功能,在需要时呈现登录控制器。
你认为这些方法怎么样?还有什么更合理的方法吗?我很想听听你对“懒惰”登录的经验。

这似乎是一个有效的实现。只要确保没有任何你不想让身份盗窃者看到的东西 :) - Undo
你需要让他们也注册吗? - Marcus Adams
3个回答

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
}

通过这种方式,您的登录管理仍然是匿名的,并且异步地,您的登录管理器可以恢复用户登录时中断的操作。


有道理,但我决定放弃这种方法,因为我不想让应用程序的许多不同部分单独处理登录检查和流程。 - nebs

0

最终我选择了一种实现方式,它可以隐藏网络管理器的登录细节,同时仍然对登录实现细节保持不可知。

我通过三个类来实现这个目标:

  • NetworkManager(面向 Web 服务的单例接口)
  • LoginManager(单例登录协调器)
  • LoginViewController(用于显示登录界面的视图控制器,例如登录按钮)

NetworkManager 有一个 LoginDelegate,它负责处理应用程序特定的登录 UI。在这种情况下,LoginManager 单例就是这个 LoginDelegate。

一般的流程如下:

  1. 应用程序通过 NetworkManager 请求服务器上的数据
  2. 如果请求的身份验证失败,则 NetworkManager 告诉其 LoginDelegate,它现在应该处理某种登录流程。
  3. LoginManager 然后在窗口的 rootViewController 上以模态方式呈现 LoginViewController。
  4. 当按下登录按钮时,LoginViewController 会告诉 LoginManager 它想要登录。
  5. LoginManager 再使用 NetworkManager 来执行实际的服务器登录。
  6. 当登录完成时,LoginManager 通过回调块得到通知。如果成功,则 LoginViewController 被关闭。

LoginManager和LoginViewController之间存在一些来回交互,但这样可以使NetworkManager在不需要了解登录流程的情况下被使用。此外,NetworkManager可以在另一个应用程序中重复使用,因为它不知道关于应用程序特定的登录视觉(因此需要委托)。

通常不会在单例模式中使用委托,但我认为在这种情况下可以使用,因为理论上这个应用程序只应该有一个登录代理。

这是第一种方法,可能会随着时间的推移进行改进。也许使用通知通知应用程序的其余部分用户已登录是一个不错的下一步。


0

我已经成功地实现了这种懒惰日志记录方法(没有问题):

  1. 创建了一个设置视图,包括注销、登录(用户名/密码),它可以是一个通用的登录页面或者一个UIWebView。
  2. 应用程序将数据发送到服务器进行身份验证(使用JSON消息)。
  3. 成功登录:我将登录数据存储在钥匙串中(使用单例模式,请参见this Apple sample codethis tutorial)。
  4. 如果用户想要使用应用程序的敏感部分,我会请求存储的用户名的密码,并且能够注销并使用不同的帐户进行登录。应用程序将输入的密码与存储的密码进行比较(离线模式)或将其发送到服务器(在线连接)。但是,根据要求,可以采用不同的实现方式。

用户很喜欢它!

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接