web-dev-qa-db-fra.com

L'autorisation Facebook a échoué sur iOS 6 lors du changement de compte FB sur l'appareil

J'utilise le Facebook SDK 3.1.1 pour implémenter FB Connect dans mon application iOS. Cela fonctionne très bien dans le cas simple, soit avec la nouvelle intégration du FB (connecté sur iOS), soit avec le retour à l'autorisation normale via l'affichage Web (l'application Facebook native n'est pas installée dans les deux cas) . Le problème se produit. lorsque je change de compte au niveau iOS. Déconnexion et connexion avec un autre compte utilisateur FB.

Pour me connecter/autoriser j'exécute:

[FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI
                                     completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
                                         [self sessionStateChanged:session state:state error:error];
                                     }];

Si alors obtenez un FBSessionStateClosedLoginFailed à chaque fois que j'effectue une closeAndClearTokenInformation lorsque cet état est atteint:

- (void)sessionStateChanged:(FBSession *)session
                  state:(FBSessionState) state
                  error:(NSError *)error
{
    NSLog(@"Session State Changed: %u", [[FBSession activeSession] state]);
    switch (state) {
        case FBSessionStateOpen:
            break;
        case FBSessionStateClosed:
        case FBSessionStateClosedLoginFailed:
            NSLog(@"FBSessionStateClosedLoginFailed ERROR: %@", [error description]);
            [[FBSession activeSession] closeAndClearTokenInformation];
            break;
        default:
            break;
}

Cependant, je reçois le même état à chaque nouvelle tentative. Mon journal dit ce qui suit:

FBSDKLog: FBSession **INVALID** transition from FBSessionStateCreated to FBSessionStateClosed
FBSDKLog: FBSession transition from FBSessionStateCreated to FBSessionStateCreatedOpening 
FBSDKLog: FBSession transition from FBSessionStateCreatedOpening to FBSessionStateClosedLoginFailed Session State Changed: 257
FBSessionStateClosedLoginFailed TOKEN: (null)
FBSessionStateClosedLoginFailed ERROR: Error Domain=com.facebook.sdk Code=2 "The operation couldn’t be completed. (com.facebook.sdk error 2.)" UserInfo=0xb24cc20 {com.facebook.sdk:ErrorLoginFailedReason=com.facebook.sdk:ErrorLoginFailedReason}

Est-ce que n'importe qui peut reproduire ceci ou avoir n'importe quelle idée où le problème pourrait se trouver?

24
Kathrin Holweger

Une autre réponse donne un moyen de resynchroniser manuellement le périphérique avec le serveur. J'ai défini une méthode appelée fbRsync pour appeler ce code. Assurez-vous de #import <Accounts/Accounts.h> dans votre fichier d'implémentation, puis définissez cette méthode:

-(void)fbResync
{
    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){

        }
    }];
}

}

J'appelle ensuite fbResync si openActiveSessionWithReadPermissions génère une erreur:

[FBSession openActiveSessionWithReadPermissions:permissions
                                   allowLoginUI:YES
                              completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
     if(error)
     {
         NSLog(@"Session error");
         [self fbResync];
         [NSThread sleepForTimeInterval:0.5];   //half a second
         [FBSession openActiveSessionWithReadPermissions:permissions
                                            allowLoginUI:YES
                                       completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
            [self sessionStateChanged:session state:state error:error];
                                       }];

     }
     else
         [self sessionStateChanged:session state:state error:error];
 }];

Le délai d'une demi-seconde est probablement inutile, mais il me donne actuellement l'esprit tranquille.

Cela semble résoudre le problème pour moi. Je peux maintenant basculer entre les comptes Facebook et je peux me connecter. Yay!

38

J'ai eu le même problème. Vérifiez que votre application FB est activée dans Paramètres -> Facebook. Le mien était désactivé (même si je ne me souviens pas de l'avoir désactivé) et une fois activé, il a été corrigé.

Au cours de mon processus de test, j'ai ajouté et supprimé mon application FB plusieurs fois de mon compte FB, qui est lié à mon iPhone. Cela peut expliquer pourquoi, comme par magie, mon application a été désactivée. 

Dans iOS 6 avec fb sdk 3.1.1. Veuillez passer les autorisations param en tant que "nil ou email" dans la méthode "[FBSessio openActiveSessionWithReadPermissions ...". Ici, mon code fonctionnait très bien.

#define IOS_NEWER_OR_EQUAL_TO_6 ( [ [ [ UIDevice currentDevice ] systemVersion ] floatValue ] >= 6.0 )

-(void)showFBLogin
{
    [FBSession.activeSession closeAndClearTokenInformation];

    NSArray *permissions = [NSArray arrayWithObjects:@"email, publish_actions, publish_stream", nil];

#ifdef IOS_NEWER_OR_EQUAL_TO_6
    permissions = nil; or NSArray *permissions = [NSArray arrayWithObjects:@"email",nil];
#endif

    NSLog(@"\npermissions = %@", permissions);
    [FBSession openActiveSessionWithReadPermissions:permissions
                                       allowLoginUI:YES
                                  completionHandler:
     ^(FBSession *session,
       FBSessionState state, NSError *error) {
         NSLog(@"\nfb sdk error = %@", error);
         switch (state) {
             case FBSessionStateOpen:
                 [[FBRequest requestForMe] startWithCompletionHandler:
                  ^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
                      if (!error) {
                          //success
                      } 
                  }];
                 break;
             case FBSessionStateClosed:
                 //need to handle
                 break;
             case FBSessionStateClosedLoginFailed:
                 //need to handle
                 break;
             default:
                 break;
         }
     }];
}
3
loganathan


J'ai le même problème sur 3.1.3 FB SDK avec iOS7.1. Et je trouve une solution ici. J'espère que ça aide !!
J'ai essayé toutes les réponses ici.
@ loganathan Aucune autorisation, @ill_always_be_a_warriors fbResync.
Tout cela ne fonctionne pas pour moi.

Mais j’ai trouvé que cela fonctionnerait bien lorsque je lancerais le même code dans le simulateur iPhone 7.1
(sans SSO "Single Sign On")

Le même code fonctionne bien sur l’ancienne version du FK SDK iOS (vous ne savez pas quelle version, mais pas la 3.13)
(mais aucun SSO ne s'affichera lors de la tentative de connexion)

Alors, j'essaye de réécrire un exemple de problème. J'ai trouvé plusieurs différents ici.
1. https://developers.facebook.com/docs/ios/getting-started Ajouter un nouveau FacebookDisplayName
2. Je modifie mon identifiant BundleID pour iTune, mais je ne le remets pas à jour dans Faceboook App Dev.


Après avoir modifié ces paramètres, cela fonctionne sur mon application iOS avec la fonctionnalité SSO.
J'espère que ça vous aidera !!

1
Evan Lin

Avez-vous essayé les méthodes RenewSystemCredential? Jetez un oeil à ce post:

Facebook iOS SDK extendAccessToken ne fonctionne pas - fbDidExtendToken n'est pas appelé

0
Hernan Arber

J'ai eu la même erreur. Mais j'ai utilisé la méthode @ill_always_be_a_warriors: -(void)fbResync mais ne fonctionne pas pour moi.

J'ai finalement trouvé que c'était mon problème d'autorisations, j'ai supprimé l'autorisation offline_access, cela fonctionne, j'espère que cela aidera quelqu'un.

0
William Hu