2013-07-26 11 views
6

Ho un servizio di back-end che mi login mia app e restituire un token di facebook esteso da precedente login, possibilmente da un altro dispositivo (quindi nessun credenziali memorizzate nella cache su questo dispositivo). Voglio utilizzare questo token per avviare una sessione di Facebook. Sto usando qualcosa come:Aprire un FBSession con esistente Token dati su iOS

FBSession* session = [[FBSession alloc] initWithPermissions:@[@"publish_actions"]]; 
FBAccessTokenData* tokenData = 
[FBAccessTokenData createTokenFromString:token 
          permissions:@[@"publish_actions"] 
          expirationDate:nil 
           loginType:FBSessionLoginTypeTestUser 
          refreshDate:nil]; 


[session openFromAccessTokenData:tokenData completionHandler:nil]; 

sto qui di passaggio 'pari a zero' per chiarezza, nel mio codice sto maneggiare il completamento e l'oggetto e entrare sessione restituito che sembra essere in uno stato aperto senza errori. Quando provo e utilizzare la sessione ottengo un errore del tipo:

Error Domain=com.facebook.sdk Code=5 "The operation couldn’t be completed. (com.facebook.sdk error 5.)" UserInfo=0xb8b1680 {com.facebook.sdk:HTTPStatusCode=403, com.facebook.sdk:ParsedJSONResponseKey={ 
    body =  { 
     error =   { 
      code = 200; 
      message = "(#200) The user hasn't authorized the application to perform this action"; 
      type = OAuthException; 
     }; 
    }; 
    code = 403; 
}, com.facebook.sdk:ErrorSessionKey=<FBSession: 0xa2b62a0, state: FBSessionStateOpen, loginHandler: 0xa29e9b0, appID: 131721883664256, urlSchemeSuffix: , tokenCachingStrategy:<FBSessionTokenCachingStrategy: 0xa273f60>, expirationDate: 4001-01-01 00:00:00 +0000, refreshDate: 2013-07-26 16:21:10 +0000, attemptedRefreshDate: 0001-12-30 00:00:00 +0000, permissions:(
    email, 
    "publish_actions" 
)>} 

Qualche suggerimento ...?

+0

Questo approccio funziona perfettamente con la versione 3.21.1 di sdk. È possibile che il token non sia stato generato da FBSessionLoginTypeTestUser e questo è il motivo per cui sta dicendo che l'utente non è autorizzato. –

risposta

5

ho trovato una soluzione: (purché si disponga di un token esistente)

prima sottoclasse della classe FBSessionTokenCachingStrategy come MySessionTokenCachingStrategy e l'override del metodo seguito:

- (FBAccessTokenData *)fetchFBAccessTokenData 
{ 
    NSMutableDictionary *tokenInformationDictionary = [NSMutableDictionary new]; 

    // Expiration date 
    tokenInformationDictionary[@"com.facebook.sdk:TokenInformationExpirationDateKey"] = [NSDate dateWithTimeIntervalSinceNow: 3600]; 

    // Refresh date 
    tokenInformationDictionary[@"com.facebook.sdk:TokenInformationRefreshDateKey"] = [NSDate date]; 

    // Token key 
    tokenInformationDictionary[@"com.facebook.sdk:TokenInformationTokenKey"] = self.token; 

    // Permissions 
    tokenInformationDictionary[@"com.facebook.sdk:TokenInformationPermissionsKey"] = self.permissions; 

    // Login key 
    tokenInformationDictionary[@"com.facebook.sdk:TokenInformationLoginTypeLoginKey"] = @0; 

    return [FBAccessTokenData createTokenFromDictionary: tokenInformationDictionary]; 
} 

quindi utilizzare la classe superiore per creare

MySessionTokenCachingStrategy* tokenCachingStrategy = 
[[MySessionTokenCachingStrategy alloc] initWithToken:token 
             andPermissions:@[@"read_stream"]]; 



FBSession *session = [[FBSession alloc] initWithAppID: nil 
              permissions: @[@"read_stream"]] 
             urlSchemeSuffix: nil 
            tokenCacheStrategy: tokenCachingStrategy]; 

    if (session.state == FBSessionStateCreatedTokenLoaded) 
    { 
     // Set the active session 
     [FBSession setActiveSession: session]; 

     // Open the session, but do not use iOS6 system acount login 
     // if the caching strategy does not store info locally on the 
     // device, otherwise you could use: 
     // FBSessionLoginBehaviorUseSystemAccountIfPresent 
     [session openWithBehavior: FBSessionLoginBehaviorWithFallbackToWebView 
       completionHandler: ^(FBSession *session, 
            FBSessionState state, 
            NSError *error) { 
        if (!error) 
        { 
         if (session.isOpen) 
         { 
          successBlock(); 
         } 
        } 
        else 
        { 
         failureBlock([error description]); 
        } 
       }]; 
    } 
+0

Grazie @ Mike Mi hai risparmiato un sacco di tempo! – sonxurxo

+1

Suggerirei di controllare ogni variabile per nil PRIMA di aggiungerla a NSMutableDictionary, ho visto arresti anomali dall'aggiunta di una stringa nulla al campo TokenInformationTokenKey. Mi sono fidato ACAccountStore di darmi un account con un token OAuth non nullo, ma che non è sempre vero –

+0

Vorrei suggerire che questo è fatto prima di creare effettivamente la strategia del token, poiché fallirà silenziosamente se una delle variabili non è presente o corretto. Questo renderà più difficile il debugging di una semplice ramificazione prima che il codice venga effettivamente chiamato. –

0

Is not questo causato dal fatto che avete bisogno di alcune autorizzazioni di lettura prima, e solo allora si può chiedere di qualche altro?

0

Si sta facendo [[FBSession alloc] initWithPermissions:@[@"publish_actions"]], il che significa che la sessione richiede solo e "ha" le autorizzazioni per publish_actions, ma guardare il token dal vostro errore:

com.facebook.sdk:ErrorSessionKey=<FBSession: 0xa2b62a0, state: FBSessionStateOpen, loginHandler: 0xa29e9b0, appID: 131721883664256, urlSchemeSuffix: , tokenCachingStrategy:<FBSessionTokenCachingStrategy: 0xa273f60>, expirationDate: 4001-01-01 00:00:00 +0000, refreshDate: 2013-07-26 16:21:10 +0000, attemptedRefreshDate: 0001-12-30 00:00:00 +0000, permissions:(
    email, 
    "publish_actions" 
) 

Il token è già troppo email permessi. Pensi che sia possibile che questo sia il problema?

Prova un'istanza con [[FBSession alloc] initWithPermissions:@[@"publish_actions", @"email"]] e controllare se avete ancora problemi.

Problemi correlati