2012-05-18 15 views
6

Użyłem Facebook Connect w innym projekcie z relatywnie niewielkimi problemami, jednak w moim obecnym projekcie wydaje mi się, że kiedy dzwonię pod numer [facebook logout];, nie usuwa on szczegółów użytkownika. Gdybym wtedy ponownie uruchomić aplikację, mam następujący w funkcji didFinishLaunchingWithOptions:iOS - Facebook Connect wyloguj się nie usuwając danych logowania?

facebook = [[Facebook alloc] initWithAppId:@"XXXXXXXXXXXXX" andDelegate:self]; 
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

if([defaults objectForKey:@"FBAccessTokenKey"] 
    && [defaults objectForKey:@"FBExpirationDateKey"]){ 
    facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"]; 
    facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"]; 

} 

    NSLog(@"startup login"); 
    [self loginToFacebook];//attempt to login automatically on startup 

Moja funkcja loginToFacebook to:

- (void)loginToFacebook 
{ 
    NSLog(@"Logging into facebook"); 
    //set up facebook and login in automatically if possible 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

    if([defaults objectForKey:@"FBAccessTokenKey"] 
     && [defaults objectForKey:@"FBExpirationDateKey"]){ 
     facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"]; 
     facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"]; 

    } 

    if (![facebook isSessionValid]){ 

     //get permissions that user will need to agree to us using 
     NSArray *permissions = [[NSArray alloc] initWithObjects: 
           @"user_likes",@"read_friendlists",@"offline_access", @"publish_stream", 
          nil]; 
     //authorise our login 
     [facebook authorize:permissions]; 
     [permissions release]; 
    } 
    else 
    { 
     [facebook authorize:nil]; 
    } 
} 

Jeśli chodzi o mnie, tym razem powinno być poproszony o zaloguj się za pomocą mojego adresu e-mail i hasła. Ja głównie za pomocą symulatora więc sama aplikacja Facebook nie jest przyczyną, a w klasie Facebook.h Zmieniłem

[self authorizeWithFBAppAuth:NO safariAuth:YES]; 

do

[self authorizeWithFBAppAuth:NO safariAuth:NO]; 

Jednak to, co się dzieje, że okna facebook krótko miga i znika, tak jak oczekiwałbym, gdy już się zaloguję. Następnie ładuje mój identyfikator, imię, listę znajomych itp. z moich poprzednich danych logowania. Nie mogę już zmieniać użytkowników! Dodam, że mam następujący kod, który drukuje się odpowiednio na „”: wylogowania

- (void)fbDidLogout{ 
    NSLog(@"Logged out of facebook"); 
} 

... która drukuje na konsoli, gdy [facebook wylogowania] jest tzw. Mam również poprawne schematy adresów URL, więc nie ma problemu.

Jak już mówiłem, pracuję nad inną aplikacją, ale nie widzę tego, co mogłem przeoczyć tym razem. Witam każdą sugestię, ponieważ podejrzewam, że jest to coś śmiesznie prostego.

Edytuj: Właśnie przetestowałem to na urządzeniu, a próba zalogowania się na Facebooku powoduje awarię aplikacji. Podejrzewam, że to dlatego, że próbuje zalogować się przy użyciu "zapisanych" informacji, które nie istnieją, ponieważ nie zalogowałem się jeszcze na urządzeniu. Nadal badam, ale znowu, jeśli ktokolwiek zauważy oczywistą wadę, byłbym bardzo wdzięczny.

Edycja2: Próbowałem usunąć pliki cookie za pomocą przykładu Safecase. Ja również wydrukować wszystkie pliki cookie w czasie) didFinishLaunchingWithOptions i b) podczas fbDidLogout i uzyskać następujące:

a) `2012-05-18 10: 40: 40.665 MojaApl [15545: 17003] ( "",

"<NSHTTPCookie version:0 name:\"c_user\" value:\"634361620\" expiresDate:2012-06-17 09:34:33 +0000 created:2012-05-18 09:34:34 +0000 (3.59026e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:TRUE>", 
"<NSHTTPCookie version:0 name:\"csm\" value:\"2\" expiresDate:2012-06-17 09:34:33 +0000 created:2012-05-18 09:34:34 +0000 (3.59026e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:FALSE>", 
"<NSHTTPCookie version:0 name:\"datr\" value:\"gxe2T8ZyBzMGb5w3LS29Q0kJ\" expiresDate:2014-05-18 09:34:33 +0000 created:2012-05-18 09:34:34 +0000 (3.59026e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:FALSE>", 
"<NSHTTPCookie version:0 name:\"locale\" value:\"en_US\" expiresDate:2012-05-25 09:36:43 +0000 created:2012-05-18 09:36:44 +0000 (3.59027e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:FALSE>", 
"<NSHTTPCookie version:0 name:\"lu\" value:\"RgayA7CMIlsAl-lOD2-Y-O3g\" expiresDate:2014-05-18 09:34:33 +0000 created:2012-05-18 09:34:34 +0000 (3.59026e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:FALSE>", 
"<NSHTTPCookie version:0 name:\"m_user\" value:\"0%3A0%3A0%3A0%3Av_1%2Cajax_1%2Cwidth_320%2Cpxr_1%2Cgps_1%3A1337333673%3A2\" expiresDate:2012-08-16 09:34:33 +0000 created:2012-05-18 09:34:34 +0000 (3.59026e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:FALSE>", 
"<NSHTTPCookie version:0 name:\"s\" value:\"Aa4WdKU-oOFathmK\" expiresDate:2012-06-17 09:34:33 +0000 created:2012-05-18 09:34:34 +0000 (3.59026e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:TRUE>", 
"<NSHTTPCookie version:0 name:\"xs\" value:\"125%3AFFIWXjAXDXUMmw%3A2%3A1337333673\" expiresDate:2012-06-17 09:34:33 +0000 created:2012-05-18 09:34:34 +0000 (3.59026e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:TRUE>" 

) `

b) 2012-05-18 10:41:16.530 MyApp[15545:17003] ( )

Ponieważ zmienia się pusta, chciałbym założyć, że zostaną usunięte. Ale po ponownym otwarciu aplikacji wszyscy znowu tam są.

Edycja3: Jedynym sposobem, w jaki znalazłem to, jest usunięcie wszystkich plików cookie zaraz po otwarciu aplikacji, jednak oznacza to, że użytkownik musi się logować za każdym razem, nawet jeśli zostawili się zalogowani, gdy ostatni raz mieli aplikacja otwarta. To chwilowa poprawka na chwilę, nadal nie jestem pewien, dlaczego to nie działa tak, jak powinno być.

Odpowiedz

19

podać tę metodę, gdy użytkownik kliknie na wylogowania i usunąć wszystkie klucze przechowywane w userdefault na facebooku

- (void)fbDidLogout 
{ 
    NSLog(@"Logged out of facebook"); 
    NSHTTPCookie *cookie; 
    NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
    for (cookie in [storage cookies]) 
    { 
     NSString* domainName = [cookie domain]; 
     NSRange domainRange = [domainName rangeOfString:@"facebook"]; 
     if(domainRange.length > 0) 
     { 
      [storage deleteCookie:cookie]; 
     } 
    } 
} 
+0

Nic nie zmieniłem Obawiam się. Klasa facebook zawiera już usuwanie plików cookie w funkcji invalidateSession, która jest wywoływana w [wylogowaniu z Facebooka]. Nadal próbowałem dodawać twój kod jawnie do mojej funkcji fbDidLogout, ale problem nadal występuje. – TheBestBigAl

+0

Dodałem to na początku mojego kodu, więc usuwa dane logowania przy każdym uruchomieniu. Nie idealne, ale działa na razie. – TheBestBigAl

+0

Awesome! Pracowałam jak magia dla mnie –

1

Uwaga: oprócz FB sklepów z aplikacjami informacje logowania w NSUserDefaults także przechowuje informacje logowania w NSHTTPCookieStorage użyciu nazwy m_user. Możesz po prostu usunąć ten rekord, aby FB ponownie zapytał Cię o dane logowania.

Mam nadzieję, że te informacje ci pomogą.

+0

OK, więc próbowałem użyć 'NSLog (@"% @ ", [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]);' sprawdzić, które pliki cookie są tam, i odpowiednio m_user pokazuje się jako jeden z nich . Czego nie rozumiem, to że klasa facebook powinna je kasować, i jak na sugestię safecase próbowałem ręcznie usunąć je wszystkie jawnie przy wylogowaniu. Z jakiegoś powodu działało to jednorazowo, ale za każdym razem, gdy się wylogowałem i uruchomiłem ponownie, pliki cookie zostały zachowane. – TheBestBigAl

+0

Zaktualizowano pytanie, aby pokazać, co dzieje się z plikami cookie. – TheBestBigAl

+0

Pamiętam, że poprawiłem kod źródłowy w tym API. Sprawdź, czy metoda wylogowania naprawdę wysyła komunikat wylogowania na serwer. – SVGreg

0

[appDelegate.session closeAndClearTokenInformation];

Właśnie ta linia kodu pomogła mi wyczyścić moje tokeny.

0
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"FBAccessTokenKey"]; 

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"FBExpirationDateKey"]; 
Powiązane problemy