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:
Dzięki d.kendall uzyskania mi sprawdzić to jeszcze raz.
Dzięki za sugestię - już wypróbowałem oba -ObjC i -all_load w "innych flagach linkerów", ale nadal utknąłem. –
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!!!! –
Proszę wyjaśnić, dlaczego to pomogło? – expert