web-dev-qa-db-fra.com

code d'erreur 304 de connexion ios facebook sdk 4.0

Je viens de mettre à jour facebook sdk v4.0

et selon le tutoriel de Utilisation d’UI de connexion personnalisées

-(IBAction)facebookLoginClick:(id)sender {

FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];

[login logInWithReadPermissions:@[@"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
    if (error) {
        // Process error
    } else if (result.isCancelled) {
        // Handle cancellations
    } else {
        // If you ask for multiple permissions at once, you
        // should check if specific permissions missing
        if ([result.grantedPermissions containsObject:@"email"]) {
            // Do work
        }
    }
}];
}

MAIS le résultat est toujours nul et le code d'erreur est 304, il me manque quelque chose?

60
jim

J'avais un problème similaire.

Après avoir initialisé FBSDKLoginManager, j'ai ajouté une ligne pour vider les données et le jeton (Facebook):

FBSDKLoginManager *loginmanager= [[FBSDKLoginManager alloc]init];    
[loginmanager logOut];

J'espère que cela t'aides.


Ainsi, exactement comme le demande le PO, "est-ce que je manque quelque chose"?

Oui, l'exemple de code standard suivant, visible partout, est tout simplement faux:

-(IBAction)facebookLoginClick:(id)sender
{
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
---- ONE MAGIC LINE OF CODE IS MISSING HERE ----
[login logInWithReadPermissions:@[@"email"]
   handler:^(FBSDKLoginManagerLoginResult *result, NSError *error)
    {
    if (error) {...}
    else if (result.isCancelled) {...}
    else { // (NB for multiple permissions, check every one)
       if ([result.grantedPermissions containsObject:@"email"])
          { NSLog(@"%@",result.token); }
       }
}];
}

vous devez faire ceci:

-(IBAction)facebookLoginClick:(id)sender
{
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login logOut];   //ESSENTIAL LINE OF CODE
[login logInWithReadPermissions:@[@"email"]
   handler:^(FBSDKLoginManagerLoginResult *result, NSError *error)
    {
    if (error) {...}
    else if (result.isCancelled) {...}
    else { // (NB for multiple permissions, check every one)
       if ([result.grantedPermissions containsObject:@"email"])
          { NSLog(@"%@",result.token); }
       }
}];
}

Sinon, très simplement, l'application ne fonctionnera pas si l'utilisateur arrive/ modifie les comptes FB sur l'appareil. (Sauf si, pour une raison quelconque, réinstallez l'application!)

Encore une fois - l'exemple de code populaire ci-dessus ne fonctionne tout simplement pas (l'application entre dans une boucle sans fin) si un utilisateur change de compte FB L’appel logOut doit être effectué.

192
Vineeth Joseph

Cela m'est arrivé lorsque j'ai changé l'appID Facebook (dans le fichier Info.plist) en remplaçant une application Facebook test par une application Facebook de production. Si, par exemple, votre application envoie le jeton Facebook à un serveur qui génère un JWT, par exemple, le kit de développement logiciel (SDK) persiste et le fbToken (FBSDKAccessToken.currentAccessToken()) persiste sauf indication contraire de le supprimer . Cela peut également se produire en production lorsqu'un utilisateur se déconnecte l'application, une demande d'API de déconnexion déconnectera l'utilisateur et réinitialisera votre JWT. Mais avant même d'envoyer la demande d'API de déconnexion, le client devra indiquer à l'instance FBSDKLoginManager de se déconnecter.

if let currentAccessToken = FBSDKAccessToken.currentAccessToken() where currentAccessToken.appID != FBSDKSettings.appID()
    {
        loginManager.logOut()
    }
6
amosel

J'avais ceci, cela s'est produit lors de la modification des détails de l'application FB dans Xcode pendant l'exécution d'une application iOS. Vous devez supprimer l'application de l'appareil, puis republier avec la nouvelle configuration de l'application FB. Une recompilation ne suffit pas pour effacer les anciens paramètres du FB

6
Adrian999

Swift 3.0

func loginWithFacebook
{
        let loginManager = FBSDKLoginManager()
        if let currentAccessToken = FBSDKAccessToken.current(), currentAccessToken.appID != FBSDKSettings.appID()
        {
            loginManager.logOut()
        }

        loginManager.logIn(withReadPermissions: ["public_profile","email"], from: self, handler: { (result, error) in
            if error != nil {
                print("error\(String(describing: error))")
            }
            else if (result?.isCancelled)! {
            }
            else {
                print(FBSDKAccessToken.current())
            }
        })
}
4
Abhishek Jain

Vous pouvez utiliser le code suivant pour résoudre votre problème: 

[FBSDKAccessToken refreshCurrentAccessToken:^(FBSDKGraphRequestConnection *connection, id result, NSError *error){}
4
Piyush Patel

J'ai également été bloqué sur cette question pendant un moment. puis j'ai créé un objet pour FBSDKLoginManager dans un fichier .h et dans le fichier viewDidLoad du fichier .m, l'initialise et définit la propriété de déconnexion.

 _fbLogin= [[FBSDKLoginManager alloc]init];    
 [_fbLogin logOut];

Cela m’a aidé et j’espère que cela vous aidera aussi… __.

Merci

2
Kunal Gupta

Selon la documentation, 304 FBSDKLoginUserMismatchErrorCode "Indique que les nouvelles autorisations n'ont pas été demandées car l'utilisateur a changé" .

Donnez un sens au scénario mentionné par Adrian999.

1
Joseph Lin

En réalité, la raison est très simple, vous pouvez essayer l'étape suivante pour réapparaître facilement ce code d'erreur.

Le " Facebook login fail " peut avoir deux raisons: 

  1. vous obtenez les informations utilisateur de facebook échouent.
  2. vous obtenez les informations sur l'utilisateur grâce au succès de Facebook, mais le téléchargement sur votre propre serveur échoue.

Le code dans FBSDKLoginManager.m est:

- (void)validateReauthentication:(FBSDKAccessToken *)currentToken withResult:(FBSDKLoginManagerLoginResult *)loginResult
{
  FBSDKGraphRequest *requestMe = [[FBSDKGraphRequest alloc] initWithGraphPath:@"me"
                                                                   parameters:nil
                                                                  tokenString:loginResult.token.tokenString
                                                                   HTTPMethod:nil
                                                                        flags:FBSDKGraphRequestFlagDoNotInvalidateTokenOnError | FBSDKGraphRequestFlagDisableErrorRecovery];
  [requestMe startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
NSString *actualID = result[@"id"];
  if ([currentToken.userID isEqualToString:actualID]) {
    [FBSDKAccessToken setCurrentAccessToken:loginResult.token];
    [self invokeHandler:loginResult error:nil];
  } else {
    NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
    [FBSDKInternalUtility dictionary:userInfo setObject:error forKey:NSUnderlyingErrorKey];
    NSError *resultError = [NSError errorWithDomain:FBSDKLoginErrorDomain
                                             code:FBSDKLoginUserMismatchErrorCode
                                         userInfo:userInfo];
   [self invokeHandler:nil error:resultError];
  }
}];
}

lorsque currentToken.userID n'est pas égal à actualID, la FBSDKLoginUserMismatchErrorCode sera lancée.

Désormais, ce problème réapparaîtra lorsque l'utilisateur A s'identifiera sur Facebook, mais vous n'aurez pas [FacebookSDKManager logOut] après, l'application mettra en cache le accessToken pour l'utilisateur A, puis l'utilisateur A changera de compte facebook en utilisateur B, lorsque l'utilisateur B se connectera à facebook encore une fois, il va réapparaître ce problème.

1
iCrany

Swift 4.0 et FBSDKCoreKit 4.33

let loginManager = LoginManager()
if let currentAccessToken = AccessToken.current, currentAccessToken.appId != SDKSettings.appId
{
    loginManager.logOut()
}
1
Maxime Felici

Swift 4.0

FBSDKLoginManager (). LogOut ()

0
Tanjim3

Authentification unique

J'ai également constaté que ce problème se produit si vous avez une application qui n'exige pas connexion unique (c'est-à-dire une application permettant à plusieurs utilisateurs de créer du contenu et de le partager à partir d'un seul appareil).

Vous pouvez modifier la connexion unique dans les paramètres de votre application https://developers.facebook.com/apps/your-app-id/settings/ .

0
Neil Japhtha

Pour moi en Objective-C, les travaux suivants ont fonctionné

FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
if ([FBSDKAccessToken currentAccessToken]) {
             [login logOut];
        }

et le problème était que l'utilisateur essayait de se connecter en tant qu'autre utilisateur, comme suggéré par @Vineeth Joseph

0
Chirag Purohit