iPhone / iOS Facebook SDK - 是否可以在应用内登录并保留登录凭据?

10

是否有可能使用Facebook iOS SDK在应用程序内进行身份验证(而不是进入Safari),并且还可以保留这些身份验证凭据以供下次启动该应用程序使用?

当我在模拟器中尝试使用演示应用程序时,它总是会进入Safari进行身份验证,这似乎有些糟糕。然后,当我进行身份验证时...如果我完全杀死该应用程序,它将要求再次进行身份验证(然后告诉我已经登录)。

是否有一种方法,只向用户提供电子邮件字段和密码字段,然后在应用程序内保存这些信息?


1
你不能使用 WebView 代替启动 Safari 吗? - Chris Brandsma
当然,但即使如此看起来也很业余。我理想中只想要电子邮件和密码字段。 - cannyboy
1
如果您在未来遇到此问题,请注意,如果您在模拟器或未安装Facebook应用程序的手机上使用SDK,则Web视图是预期的身份验证方法。 如果Facebook应用程序可用,则流程更加无缝。 但是,Facebook肯定不希望与帐户相关联的电子邮件和密码被保存“在应用程序内部”。 (即,在第三方应用程序中。) - Michael Mior
3个回答

9
请看这个问题和答案:Iphone facebook connect example calls safari. I don't want to use safari。此外,您需要将认证信息存储在NSUserDefaults中,并检查它们以防止重新登录。

编辑:一些示例代码:

保存登录信息的方法:

[[NSUserDefaults standardUserDefaults] setObject:_facebook.accessToken forKey:@"AccessToken"];
[[NSUserDefaults standardUserDefaults] setObject:_facebook.expirationDate forKey:@"ExpirationDate"];
[[NSUserDefaults standardUserDefaults] synchronize];

检查登录信息:

_facebook = [[[Facebook alloc] initWithAppId:@"[app_id]"] retain];
_facebook.accessToken    = [[NSUserDefaults standardUserDefaults] stringForKey:@"AccessToken"];
_facebook.expirationDate = (NSDate *) [[NSUserDefaults standardUserDefaults] objectForKey:@"ExpirationDate"];
if (![_facebook isSessionValid]) {
    [_facebook authorize:_permissions delegate:self];
}
else {
    [_facebook requestWithGraphPath:@"me" andDelegate:self];
}

我将尝试使用NSUserDefaults。至于使用UIWebView,它似乎有点笨拙。我可能会尝试使用电子邮件和密码UITextFields,并将其注入到不可见的UIWebView中,然后也使用JavaScript单击确认按钮。 - cannyboy
1
我添加了一些更多的示例代码。至于它看起来有些笨拙...虽然我同意你,Facebook的实现看起来更好、更不“笨拙”,但我会说,使用UIWebView对于Facebook登录是完全可接受和(现在)预期的。在我看来,我不会太担心它... - donkim

5

如果这是您真正想要的,您可以绕过它来停止它,但请注意,大多数从旧版Facebook连接API迁移到图形的其他应用程序将以新方式运行。

在facebook.m中找到以下方法:

- (void)authorizeWithFBAppAuth:(BOOL)tryFBAppAuth
                    safariAuth:(BOOL)trySafariAuth

找到didOpenOtherApp逻辑的底部,并注释掉它上面的所有内容,以便始终在内联中打开并运行包含在!didOpenOtherApp大括号中的代码部分。
// If single sign-on failed, open an inline login dialog. This will require the user to
  // enter his or her credentials.
  if (!didOpenOtherApp) {
    [_loginDialog release];
    _loginDialog = [[FBLoginDialog alloc] initWithURL:loginDialogURL
                                          loginParams:params
                                             delegate:self];
    [_loginDialog show];
  }

然而,通过这样做,您使用户更有可能需要输入他们的凭据,这肯定比忍受快速应用程序切换方法更糟糕吧?

3

当您首次进行身份验证时,请确保请求“offline_access”权限。这将使OAuth返回给您的令牌在会话结束时不会失效,而是一直有效,直到他们使用API退出Facebook应用程序。

然后,显然,您需要保存该令牌(我认为NSUserDefaults是一个不错的地方),并在以后的FB交互中重复使用它。


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