2013-03-26 3 views
12
gesendet

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:

Missing ObjC Flag

Vielen Dank für immer mich d.kendall dies wieder zu überprüfen.

Antwort

18

Sie müssen -ObjC zu "anderen Linker-Flags" in den Build-Einstellungen Ihres Projekts hinzufügen.

+0

Danke für den Vorschlag - Ich habe bereits beide -ObjC und -all_load in "anderen Linker Flags" versucht, aber ich bin immer noch fest. –

+0

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!!!! –

+1

Könnten Sie bitte erklären, warum es geholfen hat? – expert

1

Haben Sie die 3.2.1 SDK in ein anderes Verzeichnis installiert (anstatt die 3.1 SDK zu überschreiben)? Wenn ja, ist es möglich, dass xcode die ältere Version verbindet. Können Sie den Framework-Pfad in xcode bestätigen durch:

  • Im Projektnavigator, wo Sie das Facebook-Framework hinzugefügt haben, klicken Sie mit der rechten Maustaste -> Im Finder anzeigen und den 3.2.1 sdk-Speicherort öffnen;
  • Suchen Sie in den Buildeinstellungen Ihres Ziels nach "framework" und vergewissern Sie sich, dass der Framework Search Paths nur den Pfad 3.2.1 sdk enthält. Ich habe festgestellt, dass er sich an alte Framework-Positionen erinnern und den falschen Pfad verwenden kann.
  • +0

    Danke für die Hilfe! 1. Verifiziert - Es zeigt auf den Standort 3.2.1 sdk. 2. Framework-Suchpfade sehen folgendermaßen aus: $ (geerbt), "$ (SRCROOT)". Ich habe die alte Version 3.1 kopiert, bevor ich 3.2.1 installiert habe. Außerdem benutzt mein Code die neuen FBWebDialogs 3.2.1, von denen ich annehme, dass sie nicht funktionieren würden, wenn xcode in der älteren Version verlinkt hätte? –

    Verwandte Themen