He actualizado facebook sdk v4.0

y según el tutorial de El Uso Personalizado De Inicio De Sesión De La UIs

-(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
        }
    }
}];
}

PERO el resultado es siempre nula y el código de error es de 304, que me estoy perdiendo algo?

  • mostrar el error de que u está recibiendo.
InformationsquelleAutor jim | 2015-04-02

14 Comentarios

  1. 198

    He tenido un problema similar.

    Después de iniciar FBSDKLoginManager he añadido una línea a ras de los datos y la (Facebook)Token:

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

    Espero que esto ayude.


    Así, exactamente como el OP pregunta, «¿me estoy perdiendo algo»?

    Sí, con el siguiente estándar de código de ejemplo que se ve en todas partes, es simplemente erróneo:

    -(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); }
           }
    }];
    }

    usted debe hacer esto:

    -(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); }
           }
    }];
    }

    De lo contrario, muy simplemente, la aplicación no funcionará si el usuario pasa a cambio FB cuentas en el dispositivo. (A menos que suceden por alguna razón, volver a instalar la aplicación!)

    Una vez más – el popular código de ejemplo anterior simplemente no funciona (la aplicación entra en un bucle sin fin) si un usuario pasa a cambiar cuentas de FB. El logOut llamada debe hacerse.

    • Esto parece un poco excesivo. En mi caso Adrian999 la respuesta de abajo (‘apagarlo, a continuación, encienda de nuevo’) era el problema real.
    • la correcta y la impresionante respuesta. GRACIAS por salvarme horas.
    • Me alegra saber que ayudó a..:)
    • Thnx amigo.. guardó mis horas
    • Usted puede tener un problema Si se intenta cerrar la sesión antes de iniciar la sesión. Si correo electrónico no se concede permiso al usuario para su Facebook de la aplicación el usuario tendrá la opción de no conceder si se utiliza este enfoque. Así que mejor usar el * refreshCurrentAccessToken* enfoque que se describe a continuación.
    • estoy consiguiendo el resultado.isCancelled = true, ¿Qué debo hacer, por favor me ayude….
    • maldito facebook. Esto es oficial de facebook fragmento de código en cuestión!
    • Gracias man.. me olvide de este evertime…
    • Llamar logOut significa que el rerequest bandera no será añadido. Hay alguna solución para esto?
    • Estoy de acuerdo con @damian. Siento que hay una razón por la que este standard example code is seen everywhere. La sesión podría arruinar el resto de su lógica. Esto sucedió durante mis pruebas cuando he iniciado sesión con Un usuario, y se solicitan más permisos de usuario utilizando el B. Si usted no cerrar la sesión, esto obliga a la aplicación para mantener los datos de inicio de sesión para el usuario A. Si sale sin embargo, a continuación, vuelva a solicitar nuevos permisos con el usuario B, facebook tendrá que iniciar sesión con el usuario B, pero la lógica de tu aplicación todavía podría pensar que eres Un usuario (por ejemplo, si guarda su facebook id de usuario de inicio de Sesión en lugar de al añadir nuevos permisos)

  2. 7

    He tenido este, se le ocurrió al cambiar el FB de detalles de la aplicación en Xcode, mientras que una aplicación de iOS se estaba ejecutando. Usted necesita para eliminar la aplicación desde el dispositivo y, a continuación, volver a publicar con el nuevo FB configuración de la aplicación. Acaba de volver a compilar no es suficiente para que el viejo FB configuración

    • Pero esto no ayuda en absoluto en el caso de que: el usuario pasa a salir de la aplicación y, a continuación, inicio de sesión (en el navegador) como diferentes FB de usuario y, a continuación, iniciar la aplicación de nuevo.
  3. 6

    Esto me pasó a mí cuando he cambiado el Facebook AppID (en la Info.plist archivo) cambio de forma de un test de Facebook app para una producción de Facebook de la aplicación. Si la aplicación envía el Facebook token a un servidor que generar una JWT para, por ejemplo, Facebook SDK aún persiste la fbToken (FBSDKAccessToken.currentAccessToken()) persistió a menos de que se dijo que se lo quite.
    Que puede suceder también en la producción cuando el usuario cierra la sesión de la aplicación, una sesión de la API de solicitud de sesión del usuario y el restablecimiento de su JWT. Pero incluso antes de enviar el registro a cabo solicitud de la API, el cliente deberá informar a la FBSDKLoginManager instancia de cerrar la sesión.

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

    Puede utilizar el código siguiente para resolver el problema :

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

    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())
                }
            })
    }
  6. 2

    De acuerdo a la documentación, 304 FBSDKLoginUserMismatchErrorCode «Indica un error al solicitar nuevos permisos porque el usuario ha cambiado».

    Sentido en el escenario de @Adrian999 mencionado.

  7. 2

    Realidad, la razón es muy simple, usted puede intentar siguiente paso para volver a aparecer este código de error fácilmente.

    La «Facebook login fail» puede tener dos razones:

    1. de obtener la información de usuario de facebook fallar.
    2. de obtener la información de usuario de facebook éxito,pero subir a su propio error de servidor.

    El código en FBSDKLoginManager.m es:

    - (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];
      }
    }];
    }

    cuando currentToken.userID no es igual actualID, el FBSDKLoginUserMismatchErrorCode va a tirar.

    Ahora, este problema volverá a aparecer cuando el usuario de inicio de sesión de facebook fallar,pero no tiene [FacebookSDKManager logOut] después de la falla, la aplicación en la memoria caché los accessToken para el usuario y , a continuación, el usuario a cambio de facebook de la cuenta al usuario B, cuando B de usuario de inicio de sesión de facebook de nuevo,volverá a aparecer este problema.

  8. 2

    Yo también estaba pegado en este tema por un tiempo. a continuación, he creado el objeto para FBSDKLoginManager en .h archivo y en viewDidLoad de .m archivo , inicializar y cierre de sesión de la propiedad.

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

    Eso me ha ayudado, y espero ayuda de ustedes.
    Lo mejor de todo.

    Gracias

  9. 2

    Swift 4.0 y FBSDKCoreKit 4.33

    let loginManager = LoginManager()
    if let currentAccessToken = AccessToken.current, currentAccessToken.appId != SDKSettings.appId
    {
        loginManager.logOut()
    }
  10. 0

    Para mí en Objective-C siguiente trabajado

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

    y el problema era usuario estaba tratando de inicio de sesión como otro usuario como sugerido por @Vineeth José

    • a mí me funcionó
  11. -2

    Comprobar el estado de su FBSession:

    isOpen
    Indicates whether the session is open and ready for use.
    @property (readonly) BOOL isOpen;
    Declared In: FBSession.h

    https://developers.facebook.com/docs/reference/ios/3.0/class/FBSession/

  12. -4

    304 indica que nada ha cambiado. Probablemente usted está de alguna manera ya se ha autenticado y así llegar nil con 304 indica que nada ha cambiado.

    • no HTTP de código de estado 304, es FBSDKLoginUserMismatchErrorCode

Dejar respuesta

Please enter your comment!
Please enter your name here