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 子类,我的所有视图控制器都将对其进行子类化,并提供访问受保护功能的功能,并在需要时显示登录控制器。

您如何看待这些方法?还有什么更有意义的吗?我很想听听您关于“懒惰”登录的经验。

4

3 回答 3

0

我已经通过以下方式实现了这种延迟登录的方法(没有问题):

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

并且用户喜欢!

祝你好运!

于 2013-04-11T20:53:43.113 回答
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
}

这样,您的登录管理仍然是匿名的,并且您的登录管理器可以异步地从中断的位置恢复用户登录的操作。

于 2013-04-11T21:08:46.237 回答
0

我最终选择了一个实现,它对网络管理器的消费者隐藏登录细节,同时仍然不知道登录实现细节。

我通过 3 个课程实现了这一点:

  • NetworkManager(Web 服务的单例接口)
  • LoginManager(单例登录协调器)
  • LoginViewController(vc显示登录界面如登录按钮)

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 可以在另一个应用程序中重用,因为它对特定于应用程序的登录视觉效果一无所知(因此需要委托)。

委托通常不与单例一起使用,但我认为在这种情况下没问题,因为应该只有一个登录委托(理论上应该有一个登录应用程序的流程)。

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

于 2013-04-13T22:14:04.247 回答