2012-01-13 36 views
8

Tengo un SSO en Facebook que funciona perfectamente en mi aplicación, utilizando la última versión de Facebook Objective-C SDK. Necesito pedir un permiso extra dentro de la aplicación si el usuario hace "algo". No necesito pedir ese permiso si el usuario lo dio a mí antes, por lo que, supongo, en Facebook SDK debe haber un métodoiOS SDK de Facebook - Permisos de verificación

-(BOOL) checkPermission:(NSString*) permission; 

por lo que se puede utilizar de esta manera:

if([facebook checkPermission:@"email"]) { 

¿Hay alguna manera de hacerlo?

Respuesta

22

Esta pregunta es un poco antigua pero ahora puede verificar qué permisos tiene la sesión activa sin hacer una solicitud de gráfico. Aquí es cómo se hace en el HelloFacebookSample:

if ([FBSession.activeSession.permissions indexOfObject:@"publish_actions"] == NSNotFound) { 
    // permission does not exist 
} else { 
    // permission exists 
} 

basta con sustituir "publish_actions" con "e-mail".

+0

'[FBSession activeSession].permissions' devuelve los permisos que solicitaste, no los activos. O al menos eso es lo que vi. Ver mi respuesta a continuación. Necesita '[FBRequestConnection startWithGraphPath: @"/me/permission "completionHandler: ...]'. –

+1

No puedo realizar la prueba ahora, pero la documentación dice lo contrario: "Los permisos otorgados al token de acceso durante el flujo de autenticación". https://developers.facebook.com/docs/reference/ios/current/class/FBSession/ –

+0

Hoy actualicé mi pod de Facebook SDK de 3.9.0 a 3.15.1 y ahora '[FBSession activeSession] .permissions' regresa los permisos correctos y '[FBRequestConnection startWithGraphPath: @"/me/permissions "completionHandler: ...]' ya no los devuelve (ahora devuelve {status: granted, permission: installed}). –

7

SDK no proporcionar método directo para la comprobación de permisos específicos, pero se puede comprobar si el usuario otorga permiso para su aplicación mediante la comprobación permissions conexión de user object en Graph API

GET https://graph.facebook.com/me/permissions 

mismo se puede conseguir con FQL consulta en permissions table

SELECT email FROM permissions WHERE uid = me() 
+1

Gracias, sobre la base de su respuesta, he intentado usar el método '[facebook requestWithGraphPath: @" me/permissions "andDelegate: self];'. Implementando el método delegado funciona perfectamente. Gracias de nuevo –

+1

¿Podría agregar el código de su método para determinar si el permiso de correo electrónico estaba activo o no? ¿Qué será 'correo electrónico' si se concede el permiso? – Smikey

0

IMPORTANTE: Esto parece ser cierto para una versión anterior del SDK de Facebook (por ejemplo, 3.9.0). En 3.15.0 ya no funciona de esta manera. Debe usar [session.permissions] como dice Raphaël Agneau en su respuesta.

Tiene que utilizar el siguiente método, porque [FBSession activeSession].permissions parece devolver los permisos que solicitó, no los reales.

[FBRequestConnection startWithGraphPath:@"/me/permissions" 
         completionHandler:^(FBRequestConnection *c, id result, NSError *error) { 
    if (!error) { 
    NSDictionary *permissions= [(NSArray *)[result data] objectAtIndex:0]; 
    if (![permissions objectForKey:@"publish_actions"]) { 
     // Ok, continue with your logic 
    } else { 
     // Permission not found, maybe request it (see below) 
    } 
    } else { 
    // Treat error 
    } 
}]; 

Consulte aquí para obtener más información:

https://developers.facebook.com/docs/facebook-login/ios/v2.0#permissions-checking

Si no se encuentra el permiso es posible que desee solicitar esta manera:

[session requestNewPublishPermissions:PERMISSIONS_YOU_WANT 
         defaultAudience:FBSessionDefaultAudienceFriends 
        completionHandler:^(FBSession* session, NSError* error) { 

    // Try again the /me/permissions above 
}]; 
0

Aquí está mi código para FBSDK 4.2 .0 para verificar permisos. La cadena que se transfiere es el nombre del permiso, p. "publish_actions"

- (void) checkForPermission:(NSString *)permission granted:(void (^)(void))sBlock denied:(void (^)(void))fBlock { 

    if ([FBSDKAccessToken currentAccessToken]) { 

    [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me/permissions" parameters:nil] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { 

     BOOL hasPermission = NO; 

     if (!error) { 

      NSArray *permissions = [result objectForKey:@"data"]; 

      for (NSDictionary *dict in permissions) { 

       if ([[dict objectForKey:@"permission"] isEqualToString:permission]) { 

        if ([[dict objectForKey:@"status"] isEqualToString:@"granted"]) { 

         hasPermission = YES; 
        } 
       } 
      } 
     } 

     if (hasPermission) { 

      (sBlock) ? sBlock() : sBlock; 

     } else { 

      (fBlock) ? fBlock() : fBlock; 
     } 
    }]; 

    } else { 

    (fBlock) ? fBlock() : fBlock; 
} 
} 
0

para el SDK de 4+ que tienen estas 2 formas de obtener los permisos:

[[FBSDKAccessToken currentAccessToken] hasGranted:@"user_photos"] 

o

[[[FBSDKAccessToken currentAccessToken] permissions] containsObject:@"user_photos"] 
Cuestiones relacionadas