2

新的 Facebook SDK 3.0 的文档告诉我们:

“在某些情况下,对于已经将应用程序连接到其 Facebook 帐户的用户,iOS 设备将没有访问令牌。当用户使用应用程序的网站或在另一台移动设备上使用该应用程序时,可能会发生这种情况。使用iOS 6 原生身份验证对话框,应用程序需要将用户的凭据“导入”到设备中,并且需要显示 iOS 6 原生身份验证对话框。”

(见http://developers.facebook.com/docs/howtos/ios-6/,技巧 2)

我想知道如何导入这些数据,我找不到代码示例。

谢谢,

蒂姆

PS 对于信息(和测试目的),很容易在应用程序中重现上述情况:

  1. 在设置应用程序中,删除 Facebook 帐户
  2. 在正在开发的应用程序中通过 SSO 连接到 Facebook,(它应该回退到这个,因为在 iOS6 下没有注册 Facebook 帐户
  3. 在设置应用程序中再次设置 Facebook 帐户
  4. 再次尝试通过正在开发的应用程序登录。这一次它仍然会通过 SSO 访问 Facebook,因为令牌是使用它创建的。
4

3 回答 3

2

正如 MrNickBarker 建议的那样,解决方案是将用户从 SSO 中注销。但是,如果我绝对确定这样做他们的用户将通过 iOS 6 身份验证系统重新登录,我只想这样做。

我的问题是我不知道如何确保用户通过设置应用程序登录到 Facebook,我不想让用户退出 Facebook 只是让他们发送回 Facebook 应用程序每次 SSO 登录。

ACAccountStore 方法都不会告诉您用户是否已将他们的 Facebook 详细信息输入到设置应用程序中,但我最终发现 [SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook] 正是这样做的。

然后是解决方案:

ACAccountStore *accountStore = [[NSClassFromString(@"ACAccountStore") alloc] init];
ACAccountType *accountType;
if (accountStore &&
    (accountType = [accountStore accountTypeWithAccountTypeIdentifier:@"com.apple.facebook"]) &&
    [SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook])
{
    // There's an account store and it knows about Facebook - we must be on iOS 6 or higher.
    //
    // [SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook] also tells us that
    // the user has signed into their Faecbook account via the Settings app.
    //
    // At this point there could be a valid session that's been previously created via SSO prior to the
    // user signing into Facebook from Settings.app. In this case, calling openActiveSessionWithReadPermissions:
    // will continue to log on using SSO rather than the preferred route of using the built in iOS support.
    //
    // [accountStore accountsWithAccountType:accountType] will return an account for this application once
    // it's been used to log into Facebook. Clearly, if there is an account returned then the then we don't want to
    // force a logout.
    //
    // On the other hand, if no accounts are returned then we can safely call closeAndClearTokenInformation
    // in order to clear any SSO tokens, thereby ensuring that the next login will attempt to use the iOS
    // authentication (which we can do since the user has signed into the Settings app).

    if ([[accountStore accountsWithAccountType:accountType] count] == 0)
        [FBSession.activeSession closeAndClearTokenInformation];

    // Try to connect with read permissions only (as required for iOS auth)

    _usingiOSIntegratedLogin = YES;
    [FBSession openActiveSessionWithReadPermissions:nil
                                       allowLoginUI:YES
                                  completionHandler:completionHandler];
}
else
{
    // Either this is < iOS 6, or there's no Facebook account registered - request both
    // read and write permissions in order to avoid two trips to the Facebook app or web view

    _usingiOSIntegratedLogin = NO;

    NSMutableArray *permissions = [NSMutableArray arrayWithArray:[self publishPermissions]];
    [permissions insertObject:@"user_photos" atIndex:0];

    [FBSession openActiveSessionWithPermissions:permissions
                                   allowLoginUI:YES
                              completionHandler:completionHandler];
}
于 2012-10-10T09:00:01.780 回答
0

在某些情况下,iOS 设备不会为已将应用程序连接到其 Facebook 帐户的用户提供访问令牌。当用户使用应用程序的网站或在其他移动设备上使用该应用程序时,可能会发生这种情况。要使用 iOS 6 原生身份验证对话框,应用程序需要将用户的凭据“导入”到设备中,并且需要显示 iOS 6 原生身份验证对话框。一个很好的方法是请求基本的个人资料信息 - 请参阅上面的步骤 1。

请注意粗体文本,只需使用基本权限请求访问,即 openActiveSessionWithPremissions:... 并且会话将持有访问令牌。

如果它仍然使用 SSO,请首先在活动会话上关闭AndClearTokenInformation。

于 2012-10-06T15:19:57.233 回答
0

虽然回旋处接受的答案可能有效,但此功能已内置到 Facebook SDK 中。您正在寻找的是FBSession openWithBehavior:completionHandler:方法并指定FBSessionLoginBehaviorUseSystemAccountIfPresent. 它需要一些额外的工作,因为您不能使用便捷类方法FBSession openActiveSessionWithReadPermissions:allowLoginUI:completionHandler:。但是初始化会话然后设置活动会话的额外工作是微不足道的。

于 2013-01-17T02:59:41.903 回答