Ich habe gerade meine App von Facebook iOS SDK 3.1 auf 3.2.1 aktualisiert und ich versuche die Vorteile der neuen Fehlerbehandlung zu nutzen neue FBError-Kategorie auf NSError. Der Code ist am unteren Rand. Es kompiliert in Ordnung, aber wenn ein FB-Fehler auftritt, erhalte ich folgendes zur Laufzeit:Facebook iOS SDK 3.2.1 - [NSError fberrorShouldNotifyUser]: unerkannter Selektor an Instanz
- [NSError fberrorShouldNotifyUser]: unrecognized selector sent to instance
Dies scheint ein Linker-Fehler, wo die Kategorie nicht in der der FacebookSDK statischen Bibliothek verknüpft zu werden. Ich habe versucht, die Flags -ObjC und -all_load unter den anderen Linker-Flags im Ziel hinzuzufügen. Ich lese das: http://developer.apple.com/library/mac/#qa/qa1490/ aber immer noch kein Glück.
Grundsätzlich funktioniert der gleiche Code in den Beispielprojekten von Facebook. Danke für Anregungen.
// 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: Ein Freund darauf hingewiesen, dass ich überprüfen, ob die Wähler tatsächlich in der verknüpften binären existiert. Ich folgte den Anweisungen hier, um den Speicherort der Debug-Binärdatei im Finder zu finden: Where is my application binary in XCode? Dann klickte ich mit der rechten Maustaste auf MyApp.app und wählte "Show Paketinhalt". Ich fand die Binärdatei (es war die größte Datei in der Liste), zog sie in Vim und suchte nach "fberrorShouldNotifyUser". Ich konnte diesen Selektor oder einen der FBError-Selektoren nicht finden. Ich habe auch versucht, XCodes abgeleitete Daten zu löschen - immer noch kein Glück.
UPDATE # 2: Ugh, manchmal vermissen Sie völlig die offensichtliche Antwort. Es stellte sich heraus, dass das Flag "-ObjC" für meine Debug-Builds nicht richtig gesetzt war. Screenshot sehen:
Vielen Dank für immer mich d.kendall dies wieder zu überprüfen.
Danke für den Vorschlag - Ich habe bereits beide -ObjC und -all_load in "anderen Linker Flags" versucht, aber ich bin immer noch fest. –
Ok - danke, dass ich das nochmal überprüfen darf. Es stellte sich heraus, dass ich das Flag für Debug und Release gesetzt hatte, aber nicht unter einer Unterregisterkarte mit dem Titel "Any Architecture | Any SDK". Ugh, ich kann nicht glauben, dass ich das schon mal vermisst habe. Vielen Dank!!!! –
Könnten Sie bitte erklären, warum es geholfen hat? – expert