2012-03-19 29 views
6

ACTUALIZACIÓN: Me he dado cuenta de que el problema a continuación sólo se produce si el usuario ya ha dado acceso a Facebook mi aplicación, y luego reinstals mi aplicación. La primera vez que el usuario selecciona el botón de Facebook en mi aplicación, va a la aplicación de Facebook para obtener la autenticación, pero dado que el estado de autenticación aún se guarda en la aplicación de Facebook, vuelve inmediatamente a mi aplicación sin explicación para el usuario, y El método postToFacebookWall falla.usuario de Facebook SDK de iOS con la aplicación de Facebook instalado

ACTUALIZACIÓN 2: Terminé la aplicación de la solución encontrada aquí: How to authorize user through a DIALOG with the NEW Facebook Connect iOS API? y evitó la aplicación de Facebook. Safari es mejor porque al menos el usuario recibe un mensaje que dice que iniciará sesión. Sin embargo, el Diálogo de feeds aún falla la primera vez como antes.


estoy teniendo lo que debe ser un problema común, pero no he sido capaz de encontrar la solución todavía. Tenga en cuenta que mi aplicación está restringida a iOS 5 y superior.

Tengo una aplicación con un botón de Facebook para su publicación en una pared usuarios. Cuando se presiona el botón, la aplicación verificará si el usuario ya dio permiso para que la aplicación se publique en la pared. Si lo han hecho, aparece una vista con un diálogo de alimentación con la información de la publicación en la pared. Si no lo han hecho, Safari se abrirá y el usuario podrá iniciar sesión. Después de iniciar sesión, se les devolverá a la aplicación y aparecerá la vista de Diálogo de Feed.

Esto funciona en el simulador y en mi dispositivo, si la aplicación de Facebook no está instalado. Si se instala la aplicación de Facebook, se lleva al usuario a la aplicación de Facebook, pero luego se devuelve inmediatamente a la aplicación original, sin permitir que el usuario haga nada. El Diálogo de alimentación aparece, pero está completamente en blanco y se cierra automáticamente. Al presionar nuevamente el botón de Facebook, aparecerá la vista Diálogo de feed como se supone que debe hacerlo una vez que el usuario haya dado permiso a la aplicación para publicar en su muro.

yo más o menos seguido las instrucciones que se encuentran aquí: http://developers.facebook.com/docs/mobile/ios/build/#implementsso

y aquí: http://developers.facebook.com/docs/reference/dialogs/feed/

En la AppDelegate tengo el siguiente código:

- (void)loginToFacebook 
{ 
    // Set up facebook 
    self.facebook = [[Facebook alloc] initWithAppId:@"YOUR_APP_ID" andDelegate:self]; 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

    if ([defaults objectForKey:@"FBAccessTokenKey"] 
     && [defaults objectForKey:@"FBExpirationDateKey"]) { 
     self.facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"]; 
     self.facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"]; 
    } 

    if (![self.facebook isSessionValid]) { 
     [self.facebook authorize:nil]; 
    } 
} 

// This is an FBSessionDelegate protocol method 
// that gets called after a successful login 
- (void)fbDidLogin 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:[self.facebook accessToken] forKey:@"FBAccessTokenKey"]; 
    [defaults setObject:[self.facebook expirationDate] forKey:@"FBExpirationDateKey"]; 
    [defaults synchronize]; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"POST_TO_FACEBOOK_WALL" object:nil]; 
} 

// This is a UIApplicationDelegate protocol method 
// It is called when safari is dismissed 
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
    sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
    return [self.facebook handleOpenURL:url]; 
} 

La única diferencia entre esto y el código de muestra es que agregué una NSNotification que mi controlador de vista recogió, donde tengo el siguiente código:

- (void)facebookButtonPressed:(UIControl*)sender 
    { 
     Facebook *facebook = [(AppDelegate*)[[UIApplication sharedApplication] delegate] facebook]; 

     if (![facebook isSessionValid]) 
     { 
      // Login to facebook if not already logged in 
      [(AppDelegate*)[[UIApplication sharedApplication] delegate] loginToFacebook]; 
     } 
     else 
     { 
      [self postToFacebookWall]; 
     } 

    } 

    - (void)postToFacebookWall 
    { 
     Facebook *facebook = [(AppDelegate*)[[UIApplication sharedApplication] delegate] facebook]; 

     /*Facebook Application ID*/ 
     // TODO: Get this either from the AppDelegate facebook property or the info plist 
     NSString *client_id = @"YOUR_APP_ID"; 

     NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
    kAppId, @"app_id", 
    @"http://developers.facebook.com/docs/reference/dialogs/", @"link", 
    @"http://fbrell.com/f8.jpg", @"picture", 
    @"Facebook Dialogs", @"name", 
    @"Reference Documentation", @"caption", 
    @"Using Dialogs to interact with users.", @"description", 
    nil]; 

     [facebook dialog:@"feed" andParams:params andDelegate:self]; 
    } 

¿Alguien sabe cómo solucionar mi problema? (Además, en caso de que no esté claro, YOUR_APP_ID se reemplaza con mi ID de aplicación en mi código).

Respuesta

3

Esto suena como un fuera de los casos en que se trata de este escenario de 'sólo cuando se ha instalado la aplicación, authed, a continuación, desinstalar y luego reinstalada'.

Usted debe ser capaz de repliegue a "clásico autenticación vista web" cuando esto sucede cosa en particular.

if (facebookAppDidNotReturnProperly) { 
    // therefore I must have been re-installed 
    // fallback to UIWebView 

    [facebook authorizeWithFBAppAuth:NO safariAuth:NO]; 
} 

Por otra parte, también se puede utilizar autenticación Safari también supongo.

+0

Eso suena como que podría ser viable. Lo probaré. – Darren

Cuestiones relacionadas