iphone - 如何在iPhone应用程序中处理身份验证

标签 iphone ios facebook

我目前正在开发我的第一个 native iPhone应用程序(尽管我有多年的Web开发经验)。我在理解处理登录的最佳方式时遇到了一些困难,并且正在寻求有关最佳登录方式的建议。我对登录过程中可能出问题的所有事情的思考越多,我的大脑就越想跳出我的头。我对此感到非常沮丧,并可以真正使用一些更有经验的iPhone开发人员的建议。在此先感谢您的帮助。

我的目标是在该应用程序的第一个版本中支持Facebook Connect,然后在其他版本中支持其他SSO服务(Twitter,Google等)以及我自己的用户帐户系统。当前的计划是在服务器上有一个如下所示的MySQL表:

users (id, nickname, facebook_id, ...)

当用户首次通过Facebook登录该应用程序时,将在此表中为他们创建一个条目。您可能认为这不是必需的,但是稍后它将使我能够扩展到其他服务。例如,我可以这样做:
users (id, nickname, facebook_id, twitter_id, google_id, username, ...)

该表将具有用于facebook_id,twitter_id,google_id和用户名的可空字段。如果用户使用Facebook登录,则将拥有一个facebook_id。 Twitter用户将具有twitter_id,Google用户将具有google_id,而我自己的用户将具有用户名。无论他们使用什么登录系统,它们都将由我自己的ID唯一标识。

因此,我对用户帐户的后端实现非常满意。我可以设置一个Web服务,应用可以调用该服务来创建/检索用户,验证登录名等。没问题。

我遇到的问题是使用iPhone UI组件实现正确的登录流程。我的特定应用程序使用UITabBarController作为主要导航。选项卡之一标记为“我的帐户”,其中包含有关当前登录用户的信息。如果用户单击“我的帐户”选项卡,则会显示一个用作子菜单的表格 View 。它具有“我的个人资料”,“设置”等选项。如果他们单击了这些菜单项中的任何一个而没有登录,那么我将使用presentViewController函数弹出一个登录屏幕。他们单击“使用Facebook登录”,然后完成典型的Facebook授权过程。他们完成该过程后,我使用dismissViewController删除登录页面并显示他们尝试访问的页面。如果他们取消登录或登录失败,那么我将使用UINavigationController上的popViewControllerAnimated将它们发送回“我的帐户”子菜单。对于那些很难预料到这一点的人,请查看Amazon应用程序。这几乎是完全相同的事情(当您未登录时,只需单击“更多”选项卡,然后尝试单击其下方的菜单项之一)。

一切都很好,我对此感到满意。但是,这让我感到困惑:

如果它们在“我的帐户”选项卡中的UINavigationController内有多个级别,并且登录 session 已过期,我该怎么办?

让我们以Facebook登录为例。 Facebook使用 session token 来使用户保持登录状态。 token 会在一定时间后过期。假设用户导航到“我的帐户”,然后单击“我的个人资料”,然后单击“编辑”,将显示一个屏幕,用户可以在其中编辑个人资料信息。因此,显然他们需要进行身份验证才能查看此页面。实际上,它们深入到需要验证才能查看的页面的2-3级。现在,让我们说他们被电话或其他事物打扰,而忘记了他们所做的一切。他们的下一次访问 session 是在一周后的登录 session 到期后。我可以通过几种方式来处理。他们对我来说似乎都不伟大。

解决方案#1

Facebook SDK将自动在AppDelegate类上调用一个方法,该方法通知我 session 已过期。由于通知了我AppDelegate级别的 session 到期,因此我不知道用户当前正在查看哪个页面以及是否需要对其进行身份验证才能使用它。为了解决这个问题,我可以让所有需要登录的ViewController扩展“ProtectedViewController”类,或指示用户应登录才能看到该页面的东西。然后,当AppDelegate收到 session 到期通知时,它将尝试找出当前的ViewController是什么,并检查它是否扩展了“ProtectedViewController”。如果是这样,则显示一个登录屏幕。如果用户成功登录,则一切照常进行。如果不是,则将用户返回到应用程序的第一个屏幕,在该屏幕上,他们必须重新开始。这很糟糕,因为用户将丢失他们已经输入的所有内容,但是我看不出有什么办法可以避免这种解决方案。

解决方案#2

忽略AppDelegate级别的 session 到期事件,而是执行以下操作:在采取任何要求用户登录的操作之前(例如,当用户在“编辑配置文件”页面上单击“保存”时),请检查他们是否仍然存在登录。如果不是,则显示登录屏幕。如果用户登录失败,则将其发送回开始屏幕。该解决方案使您难以编写代码,因为我必须对用户在应用程序 protected 区域内所做的几乎所有操作(当他们查看页面,单击按钮时)进行检查。

如果用户无法重新进行身份验证,我还希望避免将用户一路发送回应用程序的开始屏幕。相反,在这种情况下,我更愿意将用户备份到UINavigationController的“我的帐户”菜单中-这是不需要登录的最接近页面。当然,我可以对此进行硬编码,但是我正在寻找一种更自然地工作并且可以在其他应用中重用的解决方案/模式。

我真的很感谢一些指导。当然,我不是世界上第一个需要解决此问题的人。不幸的是,谷歌并没有太大的帮助。

谢谢。

编辑:另一个想法是子类UIViewController(例如“ProtectedViewController”)并实现“viewWillAppear”方法。在此方法内,我可以检查用户是否已登录。如果未登录,则向上滑动登录页面。但是,当他们无法登录时,我仍然不知道该如何处理。但是,此解决方案有一个问题:如果用户的 session 在他们使用该应用程序时到期,那么在他们下次单击新 View 之前,我不会对其进行重新身份验证。如果他们已经在说“编辑”页面,然后单击“保存”按钮,则不会重新认证他们。但这也许是离解决方案更近的一步。

最佳答案

不要忘记,应用程序委托(delegate)是将整个选项卡栏添加到主UIWindow的委托(delegate)。在检测到凭据失败时,您可以简单地从UIWindow中删除UITabBarController,并仅用您自己的登录 View 替换它以进行重新认证。这样就消除了它们可能与选项卡结构中的任何内容进行交互的可能性,但是还原后意味着保留了它们在选项卡中的任何位置(因为您只需删除选项卡栏 Controller View ,而使 Controller 保持完整)。

关于iphone - 如何在iPhone应用程序中处理身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10793345/

相关文章:

java - FB SDK 无法在 OS 7 上运行

ios - 如何查看 Game Center 设备的 iOS 版本?

iphone - 绘制点 : and drawInRect: blurry text

c++ - 2D opengl旋转导致 Sprite 失真

ios - 第一次应用程序更新,用户数据丢失(存储在 Documents 目录中)

ios - 如何为 iPhone 安装 phonegap Facebook 插件

iphone - 为什么我的 XIB 文件无法本地化 (iPhone)?

iphone - UIWebView 未加载页面

ios - 推送 View Controller 不显示从 Storyboard添加的元素

Facebook 应用程序被重定向到 404 页面