2013-01-01 12 views
6

Zaktualizowałem swoją aplikację z pakietu SDK Facebooka 2 do wersji 3.1.Facebook iOS wydaje się utraconą sesją po powrocie do aplikacji po kliknięciu przycisku OK, masz już autoryzowaną aplikację

Mam przycisk Post na ekranie RecordsScreen. Jeśli użytkownik nie jest zalogowany na Facebooku, pojawi się strona logowania, a jeśli użytkownik jest już zalogowany, zostanie załadowany kolejny stalówka, aby zachęcić użytkownika do wprowadzenia wiadomości do wysłania na jego własną ścianę.

Mam już się zalogować. Później za każdym razem, gdy kliknę przycisk Post, strona o aplikacji jest już autoryzowana i zapyta, czy kontynuować, klikając OK. Po kliknięciu OK aplikacja kończy działanie i zaczyna ponownie uruchamiać od początku. Za każdym razem, gdy klikam przycisk Post, ta sama strona pojawia się ponownie. Wygląda na to, że nie może znaleźć prawidłowej sesji lub zgubiono token.

Testowałem to na symulatorze i urządzeniu. To samo dzieje się. Cel wdrożenia to iOS5.1.

Jedynym parametrem, którego nie wprowadziłem, jest identyfikator iPhone App Store. Czy to wpłynie na powyższe zachowanie?

Próbowałem już wiele razy i nie mogłem znaleźć rozwiązania.

Każda pomoc jest doceniana.

Dzięki!

AOBS


edytowane Jan 4:

I okazało się, że za każdym razem openSessionWithAllowLoginUI nazywa. Zostanie zwrócony stan FBSessionStateClosedLoginFailed. Wystąpił problem z zalogowaniem. Ale użytkownik ma już login od pojawienia się strony Już autoryzowane.

Powodem jest applicationWillTerminate wykonywany zaraz po openSessonWithAllowLoginUI. Czy ktoś może rzucić na to światło?


W appDelegate.h, że importować FacebookSDK/FacebookSDK.h i appDelegate.m następujące wymogiem:

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { 
return [FBSession.activeSession handleOpenURL:url); 
} 

-(void)applicationDidBecomeActive:(UIApplication *)application { 
[FBSession.activeSession handleDidBecomeActive]; 
} 

-(void)applicationWillTerminate:(UIApplication *)application { 
[FBSession.activeSession close]; 
} 

The mainViewController to sterownik wielo-, który włącza stalówki.

Zaimplementowałem klasę FBHandler do obsługi logowania/wylogowania na Facebooku. FBHandler.h zawiera #import „Facebook.h” i FBHandler jest klasa, która zawiera

-(void)sessionStateChanged:(FBSession *)session state:(FBSessionState)state error:(NSError *)error { 
    switch(state) { 
    case FBSessionStateOpen: 
     break; 
    case FBSessionStateClosed: 
    case FBSessionStateClosedLoginFailed: 
     [FBSession.activeSession closeAndClearTokenInformation]; 
    default: 
     break; 
    } 

    [[NSNotificationCenter defaultCenter]postNotificationName:FBSessionStateChangedNotification object:session]; 

    // If there is an error, display the alert view. I have skipped this code. 
} 

-(BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI { 
    return [FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { 
     [self sessionStateChanged:session state:state error:error]; 
    }]; 
} 

Jeden z piszących - RecordsScreen.xib zawiera Facebooka Zaloguj/Wyloguj przycisków. W RecordsScreen.m (miejsce, w którym użytkownik może zobaczyć jego/jej wynik i zalogować lub wylogować się z Facebook), dodaje się do viewDidLoad:

fbHandler = [[FBHandler alloc] init]; 
[fbHandler openSessionWithAllowLoginUI:NO]; 

// Also, we will listen to FBSessionStateChangedNotification in viewDidLoad. Code is skipped here. 

// The implementation of sessionStateChanged in RecordsScreen: 
-(void)sessionStateChanged:(NSNotification *)notification { 
    if (FBSession.activeSession.isOpen) { 
     if (self.facebook == nil) { 
      self.facebook = [[Facebook alloc]initWithAppId:FBSession.activeSession.appID andDelegate:nil]; 
      self.facebook.accessToken = FBSession.activeSession.accessToken; 
      self.facebook.expirationDate = FBSession.activeSession.expirationDate; 
     } 
    } else { 
     self.facebook = nil; 
    } 
} 

W RecordsScreen.m, jeśli użytkownik kliknie logowanie w przycisku,

if (!FBSession.activeSession.isOpen) { 
    // Login to Facebook. 
    [fbHandler openSessionWithAllowLoginUI:YES]; 
} else { 
    // If user is login, post to wall. 
    [self postScoreToWall]; 
} 
+0

Nie potrzebujesz identyfikatora sklepu App dla tego – Harikrishnan

+0

Czy to działa dobrze w Facebook SDK 2? – Harikrishnan

+1

Tak, wszystko działało prawidłowo w SDK 2. Kod był inny. – aobs

Odpowiedz

4

Znalazłem problem. W pliku plist "Aplikacja nie działa w tle" ustawiono na TAK. Ustawienie na NIE rozwiązało problem.

2

W kodzie, który pokazujesz, nabywasz tylko podstawowy zestaw uprawnień do odczytu dla sesji. Musi być co najmniej połączenie z reauthorizeWithPublishPermissions: przekazaniem odpowiednich uprawnień.

prostu miałem podobny problem, postanowiłem go poprzez zmianę dwie rzeczy, gdy robi login Ja nie używając dwuetapowego uprawnień metodę eskalacji że Facebook sugeruje, ale staram się nabywać uprawnienia niezbędne na logowanie za pomocą openActiveSessionWithPublishPermissions .

Musisz również upewnić się, że handleDidBecomeActive: zostanie wywołane na końcu procesu logowania do Facebooka, zanim spróbujesz wykonać kolejne wywołanie sdk. Może tak się nie stać, jeśli masz serię bloków, które wykonują różne kroki tego procesu.

Nie współpracowałem ze starszą wersją tego sdk, ale wydawało się to o wiele bardziej intuicyjne.

+0

Użyję ponownej autoryzacjiWithPublishPermissions po zalogowaniu użytkownika i kliknięciu przycisku Wyślij. Ale spróbuję twojej sugestii i zobaczę, czy to rozwiąże problem. – aobs

+0

Właśnie testowałem aplikację z uprawnieniami do zmiany na openActiveSessionWithPublishPermissions. Ten sam problem występuje. – aobs

Powiązane problemy