2012-11-19 17 views
6

Niedawno zacząłem używać Facebook SDK 3.1 i napotykam na problemy z logowaniem się przy użyciu openActiveSessionWithReadPermissions.openActiveSessionWithReadPermissions nie loguje się automatycznie

Właściwie, loguj się idealnie, jeśli dostępny jest buforowany bufor, loguje się bez prezentacji interfejsu użytkownika Facebook, a jeśli nie, pokazuje interfejs użytkownika.

Problem występuje po tym, jak zadzwonię pod numer reauthorizeWithPublishPermissions. Jeśli zadzwonię pod numer reauthorizeWithPublishPermissions, zamknij i ponownie otwórz aplikację, a następnie zadzwoń pod numer openActiveSessionWithReadPermissions, po czym wyświetli się interfejs użytkownika Facebooka i użytkownik będzie musiał powiedzieć "tak, jestem OK z uprawnieniami do odczytu", mimo że dostępny jest token buforowany.

To tylko przedstawia interfejs użytkownika Facebooka błędnie, jeśli zadzwonię pod numer reauthorizeWithPublishPermissions, w przeciwnym razie wszystko działa poprawnie.

Otwarte dla kodu Odczyt:

[FBSession openActiveSessionWithReadPermissions:readpermissions allowLoginUI:YES 
             completionHandler:^(FBSession *aSession, FBSessionState status, NSError *error) { 
      [self sessionStateChanged:[FBSession activeSession] state:status error:error]; 
      if (status != FBSessionStateOpenTokenExtended) { 
       // and here we make sure to update our UX according to the new session state 
       FBRequest *me = [[FBRequest alloc] initWithSession:aSession 
                 graphPath:@"me"]; 
       [me startWithCompletionHandler:^(FBRequestConnection *connection, 
               NSDictionary<FBGraphUser> *aUser, 
               NSError *error) { 
        self.user = aUser; 

        aCompletionBlock(aSession, status, error); 
       }]; 
      } 
     }]; 

funkcja sessionStateChanged:

- (void)sessionStateChanged:(FBSession *)aSession state:(FBSessionState)state error:(NSError *)error { 

    if (aSession.isOpen) { 
     // Initiate a Facebook instance and properties 
     if (nil == self.facebook || state == FBSessionStateOpenTokenExtended) { 
      self.facebook = [[Facebook alloc] 
          initWithAppId:FBSession.activeSession.appID 
          andDelegate:nil]; 

      // Store the Facebook session information 
      self.facebook.accessToken = FBSession.activeSession.accessToken; 
      self.facebook.expirationDate = FBSession.activeSession.expirationDate; 
     } 
    } else { 
     // Clear out the Facebook instance 
     if (state == FBSessionStateClosedLoginFailed) { 
      [FBSession.activeSession closeAndClearTokenInformation]; 
     } 
     self.facebook = nil; 
    } 
} 

Publish połączenia z pustym aPublishAction do testowania:

- (void)doPublishAction:(void(^)(FBSession *aSession, NSError *error))aPublishAction { 

    if ([FBSession.activeSession.permissions 
     indexOfObject:@"publish_actions"] == NSNotFound) { 

     NSArray *writepermissions = [[NSArray alloc] initWithObjects: 
            @"publish_stream", 
            @"publish_actions", 
            nil]; 

     [[FBSession activeSession]reauthorizeWithPublishPermissions:writepermissions defaultAudience:FBSessionDefaultAudienceFriends completionHandler:^(FBSession *aSession, NSError *error){ 
      if (error) { 
       NSLog(@"Error on public permissions: %@", error); 
      } 
      else { 
       aPublishAction(aSession, error); 
      } 


     }]; 

    } 
    else { 
     // If permissions present, publish the story 
     aPublishAction(FBSession.activeSession, nil); 
    } 
} 

Dzięki za wszystko z góry , Byłbym wdzięczny za wszelką pomoc!

+0

Myślę, że publish_actions to wszystko, czego potrzebujesz. Myślę, że teraz obejmuje on strumień publikacji. – SAHM

+0

Czy kiedykolwiek znalazłeś rozwiązanie tego problemu? Mam dokładnie ten sam problem. – Casey

+0

Nigdy nie znalazłem rozwiązania, faktycznie przestaliśmy wymagać uprawnień do publikowania, więc nigdy nie potrzebowaliśmy znaleźć rozwiązania. –

Odpowiedz

6

Trzeba dodać

[FBSession.activeSession handleDidBecomeActive];

do sposobu -(void) applicationDidBecomeActive:(UIApplication *)application w Twojej aplikacji delegata jak podano w instrukcji migration.

+0

Mam zestaw linii, funkcja wygląda następująco: '- (void) applicationDidBecomeActive: (UIApplication *) application { [FBSession.activeSession handleDidBecomeActive]; } ' , aby wyjaśnić, problem pojawia się, gdy kończę i ponownie otworzyć aplikację. –

+0

Witaj. Tak więc, o ile rozumiem, istnieje jakakolwiek szansa na '+ [FBsession openActiveSessionWithReadPermissions: allowLoginUI: completionHandler:]' uzyskanie wywołania ponownie, gdy sesja jest już otwarta? Jeśli tak się stanie, domyślnym zachowaniem jest zamknięcie sesji i próba otwarcia jej ponownie, co wyjaśniłoby problem. – ale0xB

+0

Mogę potwierdzić, że nie ma takiej szansy. Jak już powiedziałem, ten problem występuje tylko wtedy, gdy wywoływana jest opcja "ponownej autoryzacjiWindPublishPermissions" w poprzedniej sesji aplikacji. To prowadzi mnie do przekonania, że ​​to właśnie jest przyczyną problemu. –

-2

Co zrobić, jeśli używasz openActiveSessionWithPermissions zamiast openActiveSessionWithReadPermissions?

+0

To, co miałem pierwotnie, i działało idealnie. Ale jak już rozumiem, jest to amortyzowana metoda z Facebooka SDK 3.0, i że aby przełączyć się do nowego systemu Facebook SDK 3.1, należy oddzielnie żądać uprawnień do odczytu i zapisu, używając 'openActiveSessionWithReadPermissions', aby zażądać odczytu, oraz' reauthorizeWithPublishPermissions 'aby zażądać zapisu. Właśnie w tym nowym systemie mam problemy. –

+1

openActiveSessionWithPermissions jest przestarzałe. – gran33

Powiązane problemy