2011-08-17 32 views
8

que estoy usando FBConnect SDK con el fin de publicar entradas en el perfil de un usuario a través de mi solicitud. Tengo un número de problemas con esto:cuestiones FBConnect SDK de Facebook en iOS

Cuando el código relevante se ejecuta por primera vez en el dispositivo, el usuario es redirigido, como quería, a la aplicación/sitio web de Facebook, que le pide que autorice eso. si el usuario lo autoriza, se vuelve de nuevo a la aplicación, que aparece una "Conecta con Facebook" controlador de vista, que pide al usuario que ingrese. esto es raro, ya que el usuario ya está conectado, de lo contrario, ¿cómo podría autorizar la aplicación ? pero supongo que esto puede estar bien, ya que aún no había iniciado sesión a través de la aplicación. después de que inicia sesión, no hace nada. solo la segunda vez que se ejecuta el código, después de que autorizó la aplicación, el usuario obtiene el diálogo de publicación.

Si el usuario no había autorizado la aplicación, cuando se trata de volver a mi aplicación después de que el diálogo de autorización, se le pide al usuario iniciar sesión (igual que si autorizado), y no hace nada después de haber conectado la única. segunda vez que el código se corrió, se abre el diálogo de autorización, con las optinos "autorizar" & "Dejar de aplicaciones", en lugar de "autorizar" & "no autorice"/"Permitir" & "no permitir".

Además, si el usuario ha borrado su autorización a través de la configuración de su cuenta en facebook, en lugar de simplemente pidiéndole que volver a autorizar que, a estallidos de diálogo facebook (en lugar del diálogo de la post/autorización), que dice: "Un ha ocurrido un error. Por favor intente de nuevo más tarde ". Intentar más tarde no ayuda. aparecerá siempre, incluso si reinicias la aplicación. la única forma de hacer que desaparezca es volver a instalar la aplicación, lo que hará que vuelva a mostrar el cuadro de diálogo de autorización.

Así que aquí es lo que quiero lograr:

  1. Después de que el usuario autoriza a la aplicación, que no tendría que volver a iniciar sesión.
  2. Después de que el usuario autoriza la aplicación, el diálogo de publicación aparecerá immedietly, sin que éste tenga que volver a ejecutar el código (que se activa, por cierto, con un botón).
  3. Si el usuario no-autoriza la aplicación, se le pedirá de nuevo con el diálogo de autorización, en lugar del error de diálogo
  4. Si se negaba la autorización, voy a llamar a una función que muestra un error/etc.

Aquí está el código correspondiente:

MyViewController.m

- (void)shareOnFacebook 
{ 
    Facebook *facebook = [[Facebook alloc] initWithAppId:myAppID]; 
    [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] setFacebook:facebook]; 
    [facebook release]; 
    facebook = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] facebook]; 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    if ([defaults objectForKey:@"FBAccessTokenKey"] && [defaults objectForKey:@"FBExpirationDateKey"]) { 
     facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"]; 
     facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"]; 
    } 
    if (![facebook isSessionValid]) { 
     [facebook authorize:[NSArray arrayWithObjects:@"publish_stream", nil] delegate:(MyAppDelegate *)[[UIApplication sharedApplication] delegate]]; 
    } 

    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; 
    //Giving the dictionary some parameters for posting defaults 
    [facebook dialog:@"feed" andParams:dictionary andDelegate:self]; //Note: we have 2 different delegates! appDelegate for connections & url switching, and self for dialogs 
} 

MyAppDelegate.h

@interface MyAppDelegate : NSObject <UIApplicationDelegate, FBSessionDelegate, FBDialogDelegate> 
{ 
    Facebook *facebook; // kept for facebook sharing, accessed only from MyViewController although delegate methods are handeled in here 
} 
@property (nonatomic, retain) Facebook *facebook; 

@end 

MyAppDelegate.m

- (void)fbDidLogin 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"]; 
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"]; 
    [defaults synchronize]; 
} 

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

¿Es posible que me falta un par de funciones de delegado en MyViewController? Porque veo por alguna razón que lo he marcado como la implementación del protocolo FBDialogDelegate, aunque no implementa ninguna función desde allí.

Estaría muy contento si ustedes me ayudaría, ya que esto es muy frustrante para mí. No pude encontrar nada sobre esto en Internet, y siento que me estoy ahogando aquí.

Tnx por adelantado!

+0

Probablemente no sea la respuesta a su pregunta, pero me parece que uno de los problemas que podría tener es la instancia de Facebook que se recrea en cada recurso compartido. Según la documentación, parece que la instancia de Facebook generalmente se agrega a AppDelegate y nunca se reasigna cuando la aplicación se está ejecutando. Tal vez revise este código que escribí para un proyecto en el que estoy trabajando, podría ser más fácil resolver sus problemas (aún no es perfecto, pero parece funcionar bien en lo que respecta al uso compartido): http://stackoverflow.com/questions/7085162/facebook-connect-class-with-singleton-access-token-issue/7085809 # 7085809 –

Respuesta

8

Primero:

[facebook authorize:[NSArray arrayWithObjects:@"publish_stream",@"offline_access",nil] delegate:self]; 

La clave offline_access aquí mantendrá su token de autenticación viva siempre (o, más concretamente, hasta que el usuario manualmente de-autoriza su aplicación en sus ajustes de la aplicación en su Facebook Configuraciones de la cuenta). Además, configure su VC activo como delegado (más sobre esto más adelante).

En segundo lugar:

-(void)popUserShareFeed { 
    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; 
    //Giving the dictionary some parameters for posting defaults 
    [facebook dialog:@"feed" andParams:dictionary andDelegate:self]; 
} 

llamar a este método (o uno parecido) en su método -fbDidLogin delegado. También lo haga en su método original si la sesión seguía siendo válido, es decir:

if (![facebook isSessionValid]) { 
     [facebook authorize:[NSArray arrayWithObjects:@"publish_stream", nil] delegate:(MyAppDelegate *)[[UIApplication sharedApplication] delegate]]; 
} else { 
    [self popUserShareFeed]; 
} 

... y su nuevo fbDidLogin:

- (void)fbDidLogin 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"]; 
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"]; 
    [defaults synchronize]; 
    [self popUserShareFeed]; 
} 

(Nota: usted tiene que definir esto en MyViewController.m y úselo como su FBSessionDelegate. Será funcionalmente equivalente. Su AppDelegate no necesita ser también su FBSessionDelegate.

Tercero:

implementar el método -fbDidNotLogin:(BOOL)cancelledFBSessionDelegate, así:

-(void)fbDidNotLogin:(BOOL)cancelled { 
    if (cancelled) { 
     ... some alert about the user cancelling... 
    } else { 
     ... some alert about how it failed for some reason... 
    } 
} 

En cuarto lugar, por lo que sus errores bizarro ir: A) los SDK de Facebook en general no son muy grandes, y B) Sólo había puesto el token de autenticación y la fecha de vencimiento de su objeto facebook si

a) no tiene ya uno instanciado (es decir, es nil)

y

B) el vencimiento de la fecha de vencimiento está en el futuro (es decir timeIntervalSinceNow [el método de instancia NSDate] invocado devuelve> 0).

3

Parece que está experimentando el mismo problema descrito en este Facebook Platform Developer forum post. Me encuentro con el mismo problema, pero en la web. Solo una respuesta fue dada por Facebook en ese hilo, y es información incorrecta.

Facebook tiene los peores docs para desarrolladores y soporte técnico para desarrolladores alguna vez, no aguantaría la respiración esperando una solución.

0

He integrado FBConnect en tantas aplicaciones, pero nunca enfrento ese tipo de problema crítico. Por lo tanto, habría algo que falta en su código:

Insistido en comprobar FBAccessTokenKey & FBExpirationDateKey, simplemente intente con el objeto de sesión de la clase FBSession de FBConnect.

Sólo trate de usar código de minas con pocos conidtions:

session = [[FBSession sessionForApplication:@"key" secret:@"AppSecretKey" delegate:self] retain]; 
     [session resume]; 
     _posting = YES; 

     // If we're not logged in, log in first... 
     if (![session isConnected]) { 
      loginDialog = nil; 
      loginDialog = [[FBLoginDialog alloc] init]; 
      [loginDialog show]; 
     } 
      // If we have a session and a name, post to the wall! 
      else if (_facebookName != nil) { 
         [self postToWall]; // Over here posting dialog will appear , if user has already logged in or session is running. 
        } 

     } 
     else { 
      [FBBtn setTitle:@"Login" forState:UIControlStateNormal]; // if you want to change the title of button 
      [session logout]; 
     } 

Además se encargan de liberar el objeto de sesión en el método dealloc solamente, en vez de liberarlo en cualquier otro método.

- (void)dealloc { 
     [super dealloc]; 
     [session release]; 
     session = nil; 
    } 

Espero que pueda resolver su problema.

+0

¿Puede proporcionar más código/información? No pude encontrar esta clase. Todo lo que obtuve es Facebook, FBDialog, FBLoginDialog y FBRequest. – Niv

+2

@Niv Está usando el antiguo SDK de Facebook - FBConnect. Está utilizando el nuevo - Facebook iOS SDK. –

0
No

una solución directa para sus problemas de código, pero ...

Tenga en cuenta que el uso de una biblioteca de código abierto para esto? ShareKit es un gran ejemplo: http://getsharekit.com. La integración es completamente simple y hace todo lo que necesita.

+1

Recibo este error de ShareKit (esta página fue una de las primeras visitas que recibí en Google, intentando depurar ShareKit). ShareKit es terrible: la suma total de los documentos para Facebook dice "no hay configuración para Facebook", lo cual es evidentemente falso. Recomendaría evitarlo: estoy a punto de volver al SDK de FB iOS porque ShareKit es terriblemente malo. – Adam

0

que estaba teniendo el mismo problema exacto, y se utiliza la respuesta de Ben Mosher anteriormente, pero también decidió crear una clase Singleton sencilla para el objeto de Facebook, por lo que en mi AppDelegate puedo manejar la siguiente función correctamente:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
    sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { 

    return [[[FBManager defaultManager] facebook] handleOpenURL:url]; 

    //return [facebook handleOpenURL:url]; 
} 

Mi clase singleton es FBSessionDelegate y FBDialogDelegate, por lo que maneja los métodos correspondientes.

Esto me permite solo solicitar al usuario que inicie sesión cuando realmente están tratando de publicar algo, en lugar de cuando se inicia la aplicación.

1

Tuve un problema similar pero no el mismo: mensaje "Ha ocurrido un error. Vuelva a intentarlo más tarde". se mostró siempre.

El problema fue con la ID de la aplicación no configurada correctamente: fue proporcionada por el cliente (por lo que no estoy seguro de qué exactamente estaba mal); todo funciona correctamente ya que lo reemplacé con mi propia ID de aplicación de prueba (de la aplicación anterior).

Cuestiones relacionadas