ios6 facebook集成登录永远不会打开FBSessionStateClosedLoginFailed

rob*_*ure 16 facebook facebook-ios-sdk ios6

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

当我尝试更新我的应用程序的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];
}
Run Code Online (Sandbox Code Playgroud)

但它永远不会被称为!不应该被称为?我按照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];
                                         }];
}
Run Code Online (Sandbox Code Playgroud)

我也试过了

openActiveSessionWithReadPermissionsnil用于权限与意向重新授权购买所述许可publish_actions facebook的教程示例.相同的结果: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){

                }
            }];
        }
    }
Run Code Online (Sandbox Code Playgroud)

在尝试打开会话之前,我从未在我的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*hnG 40

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

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

在我的AppDelegate中


jzn*_*jzn 19

虽然JohnG的答案是正确的,但现在已弃用该特定委托方法.要使用的正确委托方法:

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

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


rav*_*avi 1

即使我无法发表评论,所以将其写为答案。我不确定,让我分析一下潜在的原因 1)你说:“但它从未被调用!不应该被调用吗?” - 为了

- (BOOL)application:(UIApplication *)application 
        openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication
     annotation:(id)annotation
Run Code Online (Sandbox Code Playgroud)

要被调用,在 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;
Run Code Online (Sandbox Code Playgroud)