Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在iPhone应用程序中处理身份验证_Iphone_Ios_Facebook - Fatal编程技术网

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

如何在iPhone应用程序中处理身份验证,iphone,ios,facebook,Iphone,Ios,Facebook,我目前正在开发我的第一个原生iPhone应用程序(尽管我有多年的网络开发经验)。我在理解处理登录的最佳方式方面遇到了一些困难,我正在寻找一些关于最佳方式的建议。我越是考虑登录过程中可能出现的问题,我的大脑就越想跳出脑袋。我对此感到非常沮丧,我真的需要一些经验丰富的iPhone开发者的建议。提前感谢你的帮助 我的目标是在应用程序的第一个版本中支持Facebook Connect,然后在将来的版本中支持其他SSO服务(Twitter、Google等),以及我自己的用户帐户系统。目前的计划是在服务器上

我目前正在开发我的第一个原生iPhone应用程序(尽管我有多年的网络开发经验)。我在理解处理登录的最佳方式方面遇到了一些困难,我正在寻找一些关于最佳方式的建议。我越是考虑登录过程中可能出现的问题,我的大脑就越想跳出脑袋。我对此感到非常沮丧,我真的需要一些经验丰富的iPhone开发者的建议。提前感谢你的帮助

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

users (id, nickname, facebook_id, ...)
[senderView addSubview:loginView]; 
当用户首次通过Facebook登录应用程序时,将在此表中为他们创建一个条目。您可能认为这是没有必要的,但它将允许我以后扩展到其他服务。例如,我可以这样做:

users (id, nickname, facebook_id, twitter_id, google_id, username, ...)
此表中的facebook\u id、twitter\u id、google\u id和username字段可以为空。如果用户使用facebook登录,他们将拥有一个facebook\u id。Twitter用户将拥有一个Twitter\u id,Google用户将拥有一个Google\u id,我自己的用户将拥有一个用户名。无论他们使用的是什么登录系统,他们都将由我自己的id唯一标识

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

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

这一切都很好,我很高兴。但我感到困惑的是:

如果他们在“我的帐户”选项卡中深入到UINavigationController的几个级别,并且他们的登录会话过期,我该怎么办

让我们以Facebook登录为例。Facebook使用会话令牌来保持用户登录。代币在一定时间后过期。假设用户向下导航到“我的帐户”,然后单击“我的个人资料”,然后单击“编辑”,屏幕上会显示他们可以编辑个人资料信息的屏幕。因此,他们显然需要通过身份验证才能查看此页面。事实上,它们深入页面2-3级,需要通过身份验证才能查看。现在,让我们假设他们被一个电话或什么东西打断,忘记了他们正在做的一切。他们下一次访问应用程序的时间是一周后,此时他们的登录会话已过期。我可以用几种方法来处理这个问题。在我看来,没有一个是好的

解决方案#1 Facebook SDK将自动调用AppDelegate类上的一个方法,通知我会话已过期。由于我在AppDelegate级别收到会话过期的通知,我不知道用户当前正在查看的页面,也不知道他们是否需要通过身份验证才能使用它。为了解决这个问题,我可以让所有需要登录以扩展“ProtectedViewController”类或指示用户应该登录才能查看该页面的ViewController。然后,当AppDelegate收到会话过期的通知时,它将尝试找出当前的ViewController是什么,并检查它是否扩展了“ProtectedViewController”。如果有,则显示登录屏幕。如果用户成功登录,则一切正常。如果没有,则将用户返回应用程序的第一个屏幕,在那里他们必须从头开始。这是不好的,因为用户将丢失他们已经输入的任何内容,但我看不出有任何方法可以避免这种情况

解决方案#2 忽略AppDelegate级别的会话过期事件,而是执行以下操作:在采取任何要求用户登录的操作之前(例如,当用户在其“编辑配置文件”页面上单击“保存”时),检查他们是否仍在登录。如果没有,则显示登录屏幕。如果用户未能登录,则将其发送回开始屏幕。这个解决方案是一个麻烦的代码,因为我必须检查用户在应用程序保护区内所做的几乎所有事情——当他们查看页面时,当他们单击按钮时——几乎所有事情

我还希望避免在用户无法重新验证时将其发送回应用程序的开始屏幕。相反,在本例中,我更愿意将用户备份到UINavigationController的“我的帐户”菜单——这是不需要登录的最接近的页面。当然,我可以硬编码,但我正在寻找一种更自然的解决方案/模式,可以在其他应用程序中重用

我真的很想得到一些指导。
[senderView addSubview:loginView]; 
UserInfo* myUser = [loginManagerObj  getValidatedUser:self.view]