2015-04-07 17 views
12

Sto integrando l'integrazione di FacebookSDK 4.x con l'interfaccia utente personalizzata e utilizzando il seguente metodo per accedere e ottenere l'autorizzazione e-mail dall'utente.Come "rerequest" permesso di posta elettronica utilizzando Facebook iOS SDK 4.x?

FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init]; 
    [login logInWithReadPermissions:@[@"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) { 
     if (error){ 
      NSLog(@"%@",[error localizedDescription]);    
     } 
     else if (result.isCancelled){ 
      NSLog(@"Cancled"); 
     } 
     else 
     { 
      if ([result.grantedPermissions containsObject:@"email"]) 
      { 
       NSLog(@"Granted all permission"); 
       if ([FBSDKAccessToken currentAccessToken]) 
       { 
        [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:nil] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) 
        { 
         if (!error) 
         { 
          NSLog(@"%@",result); 
         } 
        }]; 
       } 
      } 
      else 
      { 
       NSLog(@"Not granted"); 
      } 
     } 
    }]; 

Questo funziona perfettamente se l'utente non nega l'accesso a "email". Vedo nei documenti di FacebookSDK che posso richiedere nuovamente l'accesso all'e-mail dell'utente una volta. Secondo la documentazione FB: come indicato in questo link

If someone has declined a permission for your app, the login dialog won't let your app re-request the permission unless you pass auth_type=rerequest along with your request. 

Abilitazione Riautenticazione

Durante il vostro flusso di accesso prescelta vi abbiamo mostrato come utilizzare il dialogo Login e OAuth per autenticare qualcuno e richiedere permessi da loro. Per ri-autenticazione, è possibile utilizzare questi stessi passi con ulteriori parametri per forzarlo:

auth_type: questo parametro specifica le caratteristiche di autenticazione richiesti (come un elenco separato da virgole). Le opzioni valide sono: https - verifica la presenza di una sessione sicura di Facebook e chiede per la ri-autenticazione se esso non è presente riautenticare - chiede alla persona una nuova autenticazione incondizionatamente

auth_nonce: includes an app generated alphanumeric nonce which can be used to provide replay protection. See how to check an auth_nonce 

di più.

Ecco un esempio utilizzando l'SDK JavaScript che innesca ri-autenticazione utilizzando un auth_type di ripetere l'autenticazione:

FB.login (function (response) {// originale codice FB.login}, {auth_type : 'reauthenticate'})

Nota che il corpo della risposta contiene il parametro auth_type specificato, ad esempio:

access_token = USER_ACCESS_TOKEN & scade = SECONDS_UNTIL_TOKEN_EXPIRES & auth_type = reauthenticate

Come faccio a passare "auth_type = rerequest" ai server di Facebook tramite l'SDK per iOS? C'è un metodo speciale per questo?

risposta

15

ho risolto problema richiamando il metodo:

[logInWithReadPermissions d'accesso: @ [@ "e-mail"] handler:^(FBSDKLoginManagerLoginResult * risultato, NSError * errore)

ho bisogno di passare auth_type: 'rerequest' mentre la richiesta di nuovo e ho capito nella documentazione di questo metodo ottengo la descrizione:

Utilizzare questo metodo quando si chiede per le autorizzazioni di lettura. Dovresti solo chiedere le autorizzazioni quando sono necessarie e spiegare il valore all'utente . È possibile esaminare il risultato.declinedPermissions per fornire anche ulteriori informazioni all'utente se rifiutano le autorizzazioni.

Se [FBSDKAccessToken currentAccessToken] non è pari a zero, sarà trattato come una nuova autorizzazione per l'utente e passerà la bandiera "rerequest" alla finestra di login.

appena il problema è stato stavo chiamando Logout metodo della classe FbSDKLoginManager. Questo cancellerà il token e lo prenderà come vecchia autorizzazione non richiesta nuovamente.

+0

Ho lo stesso problema, ma come è passato auth_type: 'rerequest'? – joels

+3

In realtà non sto passando "ri-richiesta" a Facebook in modo esplicito, ma quando mai sei loggato e chiama [login logInWithReadPermissions: @ [@ "email"] gestore:^(FBSDKLoginManagerLoginResult * result, NSError * error) prendere come 'ri-richiesta'. quindi ricorda questo metodo dopo un po 'di tempo sì sì ma non devi chiamare il metodo di logout prima di chiamare questo metodo di nuovo. spero che ti possa aiutare :) – Ryuk

+0

così come ottenere l'email degli utenti quando vuoi usarla? – ArdenDev

1

In realtà non è necessario passare o chiamare auth_type: rerequest. Questo è già fatto da facebook. Se controlli FBSDKLoginManager, il codice lo fa per te.

-(NSDictionary *)logInParametersWithPermissions:(NSSet *)permissions 
{ 
    if ([FBSDKAccessToken currentAccessToken]) 
     { 
      loginParams[@"auth_type"] = @"rerequest"; 
     } 
}