2012-03-19 26 views
6

AKTUALIZACJA: Zdałem sobie sprawę, że poniższy problem występuje tylko wtedy, gdy użytkownik przyznał już Facebook dostęp do mojej aplikacji, a następnie ponownie instaluje moją aplikację. Za pierwszym razem, gdy użytkownik wybierze przycisk Facebook w mojej aplikacji, przechodzi do aplikacji Facebook, aby uzyskać uwierzytelnienie, ale ponieważ status uwierzytelnienia jest nadal zapisywany w aplikacji Facebook, natychmiast wraca do mojej aplikacji bez wyjaśnienia użytkownikowi, a postToFacebookWszystko metoda zawiedzie.Facebook SDK Logowanie do systemu iOS z zainstalowaną aplikacją Facebook

AKTUALIZACJA 2: Skończyło się wdrażanie rozwiązania znalezionego tutaj: How to authorize user through a DIALOG with the NEW Facebook Connect iOS API? i uniknąłem aplikacji Facebook. Safari jest lepsze, ponieważ przynajmniej użytkownik otrzymuje wiadomość informującą o tym, że będzie się logował. Jednak dialog z kanałem nadal kończy się niepowodzeniem po raz pierwszy, tak jak poprzednio.


Mam coś, co musi być częstym problemem, ale nie udało mi się jeszcze znaleźć rozwiązania. Pamiętaj, że moja aplikacja jest ograniczona do systemu iOS 5 i nowszych wersji.

Mam aplikację z przyciskiem Facebook do umieszczania na ścianie użytkowników. Po naciśnięciu przycisku aplikacja sprawdzi, czy użytkownik zezwolił już aplikacji na umieszczanie jej na ścianie. Jeśli tak, pojawi się widok z oknem kanału z informacjami o ścianie. Jeśli nie, Safari zostanie otwarte, a użytkownik będzie mógł się zalogować. Po zalogowaniu zostaną odesłani do aplikacji i pojawi się okno dialogowe Feed Dialog.

Działa na symulatorze i na moim urządzeniu, jeśli aplikacja Facebook nie jest zainstalowana. Jeśli aplikacja Facebook jest zainstalowana, użytkownik jest przenoszony do aplikacji Facebook, ale natychmiast powraca do oryginalnej aplikacji, nie pozwalając użytkownikowi na nic. Pojawi się okno podawania, ale jest ono całkowicie puste i automatycznie znika. Ponowne naciśnięcie przycisku Facebook spowoduje wyświetlenie okna dialogowego kanału, tak jak ma to miejsce, gdy użytkownik wyrazi zgodę na umieszczenie aplikacji na ścianie.

ja dość dużo przestrzegać instrukcji znaleźć tutaj: http://developers.facebook.com/docs/mobile/ios/build/#implementsso

i tutaj: http://developers.facebook.com/docs/reference/dialogs/feed/

Z tej AppDelegate Mam następujący kod:

- (void)loginToFacebook 
{ 
    // Set up facebook 
    self.facebook = [[Facebook alloc] initWithAppId:@"YOUR_APP_ID" andDelegate:self]; 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

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

    if (![self.facebook isSessionValid]) { 
     [self.facebook authorize:nil]; 
    } 
} 

// This is an FBSessionDelegate protocol method 
// that gets called after a successful login 
- (void)fbDidLogin 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:[self.facebook accessToken] forKey:@"FBAccessTokenKey"]; 
    [defaults setObject:[self.facebook expirationDate] forKey:@"FBExpirationDateKey"]; 
    [defaults synchronize]; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"POST_TO_FACEBOOK_WALL" object:nil]; 
} 

// This is a UIApplicationDelegate protocol method 
// It is called when safari is dismissed 
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
    sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
    return [self.facebook handleOpenURL:url]; 
} 

Jedyną różnicą między tym i przykładowy kod jest taki, że dodałem NSNotification odebrany przez mój kontroler widoku, gdzie mam następujący kod:

- (void)facebookButtonPressed:(UIControl*)sender 
    { 
     Facebook *facebook = [(AppDelegate*)[[UIApplication sharedApplication] delegate] facebook]; 

     if (![facebook isSessionValid]) 
     { 
      // Login to facebook if not already logged in 
      [(AppDelegate*)[[UIApplication sharedApplication] delegate] loginToFacebook]; 
     } 
     else 
     { 
      [self postToFacebookWall]; 
     } 

    } 

    - (void)postToFacebookWall 
    { 
     Facebook *facebook = [(AppDelegate*)[[UIApplication sharedApplication] delegate] facebook]; 

     /*Facebook Application ID*/ 
     // TODO: Get this either from the AppDelegate facebook property or the info plist 
     NSString *client_id = @"YOUR_APP_ID"; 

     NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
    kAppId, @"app_id", 
    @"http://developers.facebook.com/docs/reference/dialogs/", @"link", 
    @"http://fbrell.com/f8.jpg", @"picture", 
    @"Facebook Dialogs", @"name", 
    @"Reference Documentation", @"caption", 
    @"Using Dialogs to interact with users.", @"description", 
    nil]; 

     [facebook dialog:@"feed" andParams:params andDelegate:self]; 
    } 

Czy ktoś wie, jak naprawić mój problem? (W przypadku, gdy nie jest jasne, nazwa YOUR_APP_ID jest zamieniana na mój identyfikator aplikacji w moim kodzie).

Odpowiedz

3

To brzmi jak przypadek, ponieważ jest to scenariusz "tylko wtedy, gdy aplikacja została zainstalowana, automatycznie uwierzytelniona, a następnie odinstalowana, a następnie ponownie zainstalowana".

Powinieneś być w stanie powrócić do "klasycznego uwierzytelniania widoku internetowego", kiedy to się dzieje.

if (facebookAppDidNotReturnProperly) { 
    // therefore I must have been re-installed 
    // fallback to UIWebView 

    [facebook authorizeWithFBAppAuth:NO safariAuth:NO]; 
} 

Z drugiej strony można również użyć autouruchamiania Safari.

+0

To brzmi jak może to być opłacalne. Dam temu szansę. – Darren

Powiązane problemy