Native Facebook Login stopped working after SDK update to 3.14

后端 未结 5 2384
名媛妹妹
名媛妹妹 2020-12-07 23:09

Update: Somehow the behaviour seems to have changed. I don\'t get the error message any more but the native login still does not work. Instead I am redirect

相关标签:
5条回答
  • 2020-12-07 23:33

    Perhaps you may be missing this method:

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

    It helped my case in which I had to migrate from 3.9.0 to the latest. Hope it helps.

    0 讨论(0)
  • 2020-12-07 23:39

    I just ran to this issue also, here's the details on what has happened & how I fixed my app.

    Bottom line
    Due to the new login process wherein users can now approve / deny each requested permission (something not supported by the native ios integrated login), Facebook has changed the sdk's default login behavior to first try the Facebook fast app switch & then fall back on the web view, completely ignoring any ios system level Facebook credentials.

    This is noted in the upgrade guide (form 3.13 > 3.14) here: https://developers.facebook.com/docs/ios/upgrading

    Relevant portion:
    "The default login behavior has changed from FBSessionLoginBehaviorUseSystemAccountIfPresent to FBSessionLoginBehaviorWithFallbackToWebView."

    So what to do?
    Well, if you don't need any of the new things, FBLikeControl etc..., that were introduced in 3.14, you could just downgrade to 3.13. However, if you want/need to use 3.14n there's an instance method on FBSession that takes the FBSessionLoginBehavior as a parameter: https://developers.facebook.com/docs/reference/ios/current/class/FBSession/#openWithBehavior:completionHandler:

    I updated the body of my method for opening a Facebook session from:

        [FBSession openActiveSessionWithReadPermissions:@[@"email", @"user_location"]
                                           allowLoginUI:YES
                                      completionHandler:
                                              ^(FBSession *session, FBSessionState state, NSError *error) {
                                                  [self sessionStateChanged:session state:state error:error];
                                              }
        ];
    

    to:

        FBSessionStateHandler completionHandler = ^(FBSession *session, FBSessionState status, NSError *error) {
            [self sessionStateChanged:session state:status error:error];
        };
    
        if ([FBSession activeSession].state == FBSessionStateCreatedTokenLoaded) {
            // we have a cached token, so open the session
            [[FBSession activeSession] openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent
                      completionHandler:completionHandler];
        } else {
            [self clearAllUserInfo];
            // create a new facebook session
            FBSession *fbSession = [[FBSession alloc] initWithPermissions:@[@"email", @"user_location"]];
            [FBSession setActiveSession:fbSession];
            [fbSession openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent
                      completionHandler:completionHandler];
        }
    

    NOTE: my clearAllUserInfo method includes the following lines:

        [FBSession.activeSession closeAndClearTokenInformation];
        [FBSession renewSystemCredentials:^(ACAccountCredentialRenewResult result, NSError *error) {
            NSLog(@"%@", error);
        }];
        [FBSession setActiveSession:nil];
    

    It's also worth checking out the Facebook documentation on understanding sessions: http://developers.facebook.com/docs/facebook-login/ios/v2.0#sessions

    0 讨论(0)
  • 2020-12-07 23:45

    I have run into this issue as well. A quick workaround is simply to have the user delete their iOS Facebook credentials, login with your app, then put their credentials back in.

    0 讨论(0)
  • 2020-12-07 23:45

    if you use Facebook SDK 4.0, a login behavior can be set. The default value is FBSDKLoginBehaviorNative, but you may set it to FBSDKLoginBehaviorSystemAccount.

    See below code:

    FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init];
    login.loginBehavior = FBSDKLoginBehaviorSystemAccount;
    [loginManager logInWithReadPermissions:@[@"email"]
                        fromViewController:self
                                   handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
      //TODO: process error or result
     }];
    
    0 讨论(0)
  • 2020-12-07 23:52

    Check the permissions you ask for, in the new SDK (3.14) the basic_info permission has been deprecated and you need to submit the app for review for extended permissions. The basic permissions are: public_profile, email, and user_friends

    More info here: https://developers.facebook.com/docs/ios/upgrading

    0 讨论(0)
提交回复
热议问题