2013-03-26 17 views
12

Właśnie zaktualizowałem swoją aplikację z serwisu Facebook iOS SDK 3.1 do wersji 3.2.1 i próbuję wykorzystać nową obsługę błędów dostarczoną przez nowa kategoria FBError w NSError. Kod znajduje się na dole. Kompiluje grzywny, ale w przypadku wystąpienia błędu FB, otrzymuję następujący w czasie wykonywania:Facebook iOS SDK 3.2.1 - [NSError fberrorShouldNotifyUser]: nierozpoznany selektor wysłany do instancji

- [NSError fberrorShouldNotifyUser]: unrecognized selector sent to instance 

Wydaje się to błędem łącznikową, gdzie kategoria nie jest uzyskiwanie powiązana z statycznej biblioteki FacebookSDK. Próbowałem dodać flagi -ObjC i -all_load pod innymi flagami linkera w celu. Czytam to: http://developer.apple.com/library/mac/#qa/qa1490/, ale wciąż nie ma szczęścia.

Zasadniczo ten sam kod działa dobrze w przykładowych projektach dostarczanych przez Facebook. Dzięki za wszelkie sugestie.

// Open the Facebook session. 
- (void)openSession { 
    NSArray *permissions = [[NSArray alloc] initWithObjects:@"email", nil]; 

    // Open or re-open the active session 
    [FBSession openActiveSessionWithReadPermissions:permissions 
            allowLoginUI:YES 
           completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { 
     [self sessionStateChanged:session state:state error:error]; 
    }]; 
} 

- (void)handleAuthError:(NSError *)error{ 
    NSString *alertMessage, *alertTitle; 

    if (error.fberrorShouldNotifyUser) { 
     // If the SDK has a message for the user, surface it. This conveniently 
     // handles cases like password change or iOS6 app slider state. 
     alertTitle = @"Something Went Wrong"; 
     alertMessage = error.fberrorUserMessage; 
    } else if (error.fberrorCategory == FBErrorCategoryAuthenticationReopenSession) { 
     // It is important to handle session closures as mentioned. You can inspect 
     // the error for more context but this sample generically notifies the user. 
     alertTitle = @"Session Error"; 
     alertMessage = @"Your current session is no longer valid. Please log in again."; 
    } else if (error.fberrorCategory == FBErrorCategoryUserCancelled) { 
     // The user has cancelled a login. You can inspect the error 
     // for more context. For this sample, we will simply ignore it. 
     NSLog(@"user cancelled login"); 
    } else { 
     // For simplicity, this sample treats other errors blindly, but you should 
     // refer to https://developers.facebook.com/docs/technical-guides/iossdk/errors/ for more information. 
     alertTitle = @"Unknown Error"; 
     alertMessage = @"Error. Please try again later."; 
     NSLog(@"Unexpected error:%@", error); 
    } 

    if (alertMessage) { 
     [[[UIAlertView alloc] initWithTitle:alertTitle 
           message:alertMessage 
           delegate:nil 
         cancelButtonTitle:@"OK" 
         otherButtonTitles:nil] show]; 
    } 

} 

// Handle Facebook session state changed 
- (void)sessionStateChanged:(FBSession *)session 
         state:(FBSessionState)state 
         error:(NSError *)error { 
    if (error) { 
     [self handleAuthError:error]; 
    } else { 
     switch (state) { 
      case FBSessionStateOpen: 
       [self onSessionOpen:session]; 
       break; 
      case FBSessionStateOpenTokenExtended: 
       [self onSessionOpen:session]; 
       break; 
      case FBSessionStateClosedLoginFailed: 
       [self onSessionClose:error]; 
       break; 
      case FBSessionStateClosed: 
       // No-op 
       // See: https://developers.facebook.com/docs/reference/ios/3.1/class/FBSession 
       // Session is closed but token is still cached for later use. 
       break; 
      default: 
       NSLog(@"sessionStateChanged: unknown state: %d", state); 
       break; 
     } 
    } 
} 

UPDATE: Znajomy poradził, że należy sprawdzić, czy rzeczywiście istnieje selektor w połączonej binarny. Postępowałem zgodnie z instrukcjami tutaj, aby znaleźć lokalizację pliku binarnego debugowania w Finderze: Where is my application binary in XCode? Następnie kliknąłem prawym przyciskiem myszy na MyApp.app i wybrałem "Pokaż zawartość opakowania". Znalazł plik binarny (był to największy plik na liście), przeciągnął go do Vima i szukał "fberrorShouldNotifyUser". Nie mogłem znaleźć tego selektora ani żadnego z selektorów FBError. Próbowałem również wyczyścić dane pochodne XCode - wciąż nie ma szczęścia.

AKTUALIZACJA # 2: Ugh, czasami tęskni się za oczywistą odpowiedzią. Okazuje się, że nie ustawiłem poprawnie flagi -ObjC dla moich kompilacji debugowania. Zobacz zrzut ekranu:

Missing ObjC Flag

Dzięki d.kendall uzyskania mi sprawdzić to jeszcze raz.

Odpowiedz

18

Musisz dodać opcję -ObjC do "innych znaczników linkera" w ustawieniach kompilacji projektu.

+0

Dzięki za sugestię - już wypróbowałem oba -ObjC i -all_load w "innych flagach linkerów", ale nadal utknąłem. –

+0

OK - dziękuję za to, żebym to znowu sprawdził. Okazuje się, że ustawiłem flagę Debugowania i wydania, ale nie pod zakładką podrzędną wersji "Any Architecture | Any SDK". Ugh, nie mogę uwierzyć, że przedtem tęskniłem. Dzięki!!!! –

+1

Proszę wyjaśnić, dlaczego to pomogło? – expert

1

Czy zainstalowałeś 3.2.1 sdk w innym katalogu (zamiast nadpisywać 3.1 SDK)? Jeśli tak, to możliwe, że xcode łączy starszą wersję. Można potwierdzić ścieżkę ramową w Xcode przez:

  1. W nawigatorze projektu, w którym dodany Framework Facebook, kliknij prawym przyciskiem -> Pokaż w Finderze i zweryfikować otwiera lokalizację 3.2.1 sdk; i,
  2. W ustawieniach kompilacji celu, wyszukaj "framework" i zweryfikuj Ścieżki Search Framework tylko ścieżka 3.2.1 sdk - Odkryłem, że pamięta stare lokalizacje szkieletu i używa złą ścieżkę.
+0

Dzięki za pomoc! 1. Zweryfikowany - Wskazuje lokalizację 3.2.1 sdk. 2. Ścieżki wyszukiwania struktury wyglądają następująco: $ (dziedziczony), "$ (SRCROOT)". Przed zainstalowaniem 3.2.1 usunąłem starą wersję 3.1. Ponadto, mój kod używa nowych rzeczy 3.2.1 FBWebDialogs, które, jak zakładam, nie działałyby, gdyby xcode był linkowany w starszej wersji? –

Powiązane problemy