16

这个问题与iOS 4.0 设备上的 Facebook SDK for iOS非常相似,但由于我无法在那里发表评论,因此我提出了一个新问题。我认为问题不一样:

当尝试将我的应用程序的 facebook 集成更新到 facebook 3.1 时,我没有让 facebook 会话打开 sessionStateChanged 回调总是以 FBSessionStateClosedLoginFailed 结束。在我的设置中,我的 appdelegate 中有回调

- (BOOL)application:(UIApplication *)application 
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
    // attempt to extract a token from the url
    //    return [self.session handleOpenURL:url]; 
    return [FBSession.activeSession handleOpenURL:url];
}

但它永远不会被调用!它不应该被调用吗?我遵循了 facebook 文档并致电

- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
    NSArray *permissions = [NSArray arrayWithObjects:@"publish_actions", nil];
    return [FBSession openActiveSessionWithPublishPermissions:permissions
                                              defaultAudience:FBSessionDefaultAudienceFriends
                                              allowLoginUI:allowLoginUI
                                         completionHandler:^(FBSession *session,
                                                             FBSessionState state,
                                                             NSError *error) {
                                             [self sessionStateChanged:session
                                                                 state:state
                                                                 error:error];
                                         }];
}

我也试过

openActiveSessionWithReadPermissions使用nilfacebook 教程示例中的权限,以便稍后重新授权 publish_actions 权限。同样的结果: FBSessionStateClosedLoginFailed 再次。

我什至试着打电话

ACAccountStore *accountStore;
    ACAccountType *accountTypeFB;
    if ((accountStore = [[ACAccountStore alloc] init]) &&
        (accountTypeFB = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook] ) ){

        NSArray *fbAccounts = [accountStore accountsWithAccountType:accountTypeFB];
        id account;
        if (fbAccounts && [fbAccounts count] > 0 &&
            (account = [fbAccounts objectAtIndex:0])){

            [accountStore renewCredentialsForAccount:account completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) {
                //we don't actually need to inspect renewResult or error.
                if (error){

                }
            }];
        }
    }

在尝试打开会话之前,但我从来没有在我的 ios6 设备(iphone 4s)上打开它。在应用程序中,我被要求获得许可,但由于会话始终处于 FBSessionStateClosedLoginFailed 状态,因此什么也没有发生!我对会话状态的回调是

- (void)sessionStateChanged:(FBSession *)session
                      state:(FBSessionState) state
                      error:(NSError *)error
{
    switch (state) {
        case FBSessionStateOpen:
            if (!error) {
                // We have a valid session
                NSLog(@"User session found");
            }
            break;
        case FBSessionStateClosed:
            NSLog(@"FBSessionStateClosed");
        case FBSessionStateClosedLoginFailed:
            NSLog(@"FBSessionStateClosedLoginFailed");
            [FBSession.activeSession closeAndClearTokenInformation];
            break;
        default:
            break;
    }

    [[NSNotificationCenter defaultCenter]
     postNotificationName:FBSessionStateChangedNotification
     object:session];

    if (error) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"facebook Hinweis"
                                                        message:@"facebook Login nicht möglich, bitte versuchen Sie es erneut."
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
        NSLog(@"Facebook session error: %@", error.localizedDescription);
    }
}

在 ios 5 上使用 facebook 3.0 我从来没有遇到过问题,所以我的 facebook 应用程序设置正确。我真的很感激任何帮助让我能够打开 facebook 会话,没想到会遇到 facebook 3.1 的这些问题,而且文档在这一点上没有帮助我,谢谢

4

6 回答 6

40

我有同样的问题,这是因为我忘了实施

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    return [FBSession.activeSession handleOpenURL:url];
}

在我的 AppDelegate

于 2012-12-30T22:43:07.537 回答
19

虽然 JohnG 的回答是正确的,但该特定委托方法现在已被弃用。要使用的正确委托方法是这样的

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    return [FBSession.activeSession handleOpenURL:url];
}

将它放在我的应用程序委托中为我解决了这个问题。如果没有这个,iOS 6.0 的本机登录会起作用,但 Facebook 应用登录会失败。

于 2013-03-19T19:19:29.180 回答
2

我有同样的问题。如果用户没有在系统偏好设置中配置 Facebook 帐户,则会出现 Facebook 登录对话框,并且一切正常。但是,如果用户在设备中配置了一个帐户,我总是会FBSessionStateClosedLoginFailed出错。

这无关,handleOpenURL:url因为在 iOS 6 或更高版本的“本机登录流程”中没有快速应用程序更改。因此,您的应用永远不会进入后台,并且不需要 URL 重定向。

问题已解决配置 Facebook 应用程序。您需要启用“本机 iOS 登录”部分并输入您的应用程序的捆绑 ID。如果您的应用程序尚未在 Apple Store 中,恐怕您需要将沙盒模式设置为 ON。一旦您的应用程序在 Apple Store 中发布,我认为您需要将沙盒模式设置为 OFF 并在 Facebook 配置中设置 Apple Store ID。

于 2013-08-23T09:05:36.930 回答
1

即使我不能发表评论,所以把它写成答案。我不确定,让我分析一下潜在的原因 1)你说:“但它永远不会被调用!它不应该被调用吗?” - 为了

- (BOOL)application:(UIApplication *)application 
        openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication
     annotation:(id)annotation

要被调用,在 info.plist 文件中,应正确设置 url 方案,即转到 URL 类型-->Item0-->URL 方案--->Item 0,此处的值应为 fbAPPID,即 fb 附加您的实际 facebookappID [FacebookAppID 也可能存在于 info.plist 中或硬编码在代码中]。

2)你说:“sessionStateChanged 回调总是以 FBSessionStateClosedLoginFailed 结束”

在 sessionStateChanged 开关方法中检查会话的状态,如果它创建或 createdTokenLoaded 然后尝试打开会话。

注意:[FBSession openActiveSessionWithPublishPermissions ....] 这是一个静态方法将创建一个新会话并设置为 FBSession.activeSession 其中 openWithCompletionHandler 是一个实例方法,只有在会话已经创建时才能工作。

    case FBSessionStateCreated:
    case FBSessionStateCreatedTokenLoaded:{
        [session openWithCompletionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
            //handle the updating of views according to the sate of session 
        }];
        break;
于 2012-10-01T20:34:42.653 回答
0

在 FB SDK 3.5 上,您可以使用以下命令终止令牌:

    [[FBSessionTokenCachingStrategy defaultInstance] clearToken];
于 2013-06-03T18:32:51.380 回答
0

我同意 JohnG 的观点,另外需要注意的是:

请注意,如果您在 内有多个案例handleOpenURL:,您可以过滤:

if ([sourceApplication isEqualToString:@"com.facebook.facebook"] ||
    [sourceApplication isEqualToString:@"com.facebook.Facebook"]){
  //Do Stuff
}

这很奇怪,但我能够在多个设备上复制sourceApplication以“Facebook”和“facebook”的形式回归。

于 2013-03-19T00:18:43.670 回答