2013-03-26 7 views
12

Ho appena aggiornato la mia app da Facebook iOS SDK 3.1 alla 3.2.1 e sto cercando di sfruttare la nuova gestione degli errori fornita dal nuova categoria FBError su NSError. Il codice è in fondo. Si compila bene, ma quando si verifica un errore FB, ottengo il seguente in fase di esecuzione:Facebook iOS SDK 3.2.1 - [NSError fberrorShouldNotifyUser]: selettore non riconosciuto inviato all'istanza

- [NSError fberrorShouldNotifyUser]: unrecognized selector sent to instance 

Questo mi sembra un errore di linker, in cui la categoria non è sempre legata a dalla libreria statica del FacebookSDK. Ho provato ad aggiungere entrambi i flag -ObjC e -all_load sotto gli altri flag del linker nella destinazione. Ho letto questo: http://developer.apple.com/library/mac/#qa/qa1490/ ma ancora senza fortuna.

Fondamentalmente lo stesso codice funziona bene nei progetti di esempio forniti da Facebook. Grazie per eventuali suggerimenti.

// 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: Un amico consigliato che verifico se il selettore esiste realmente nel binario collegato. Ho seguito le istruzioni qui per trovare la posizione del binario di debug nel finder: Where is my application binary in XCode? Quindi, ho fatto clic con il pulsante destro del mouse su MyApp.app e ho scelto "Mostra contenuto pacchetto". Trovato il file binario (era il file più grande nella lista), trascinato in Vim e cercato "fberrorShouldNotifyUser". Non ho trovato questo selettore o nessuno dei selettori FBError. Ho anche provato a cancellare i dati derivati ​​da XCode - ancora senza fortuna.

UPDATE # 2: Ugh, a volte ti manca totalmente la risposta ovvia. Si scopre che non avevo il flag -ObjC impostato correttamente per le mie build di debug. Visualizza gli screenshot:

Missing ObjC Flag

Grazie a d.kendall per avermi di controllare questo nuovo.

risposta

18

È necessario aggiungere -ObjC a "altri flag di linker" nelle impostazioni di generazione del progetto.

+0

Grazie per il suggerimento - Ho già provato sia -ObjC che -all_load in "altri linker flag", ma sono ancora bloccato. –

+0

Ok, grazie per avermi fatto controllare di nuovo. Risulta che ho avuto il flag impostato per Debug e Release, ma non sotto una sottoscheda di Release intitolata "Any Architecture | Any SDK". Uh, non posso credere di averlo perso prima. Grazie!!!! –

+1

Potresti spiegare perché ha aiutato? – expert

1

Hai installato il sdk 3.2.1 in una directory diversa (invece di sovrascrivere il sdk 3.1)? Se è così, è possibile che xcode stia collegando la versione precedente. Puoi confermare il percorso del framework in xcode di:

  1. Nel navigatore di progetto in cui hai aggiunto il framework di Facebook, fai clic con il tasto destro del mouse -> Mostra nel Finder e verifica che apra la posizione sdk 3.2.1; e,
  2. Nelle impostazioni di generazione del target, cercare "framework" e verificare che i percorsi di ricerca del framework includano solo il percorso sdk 3.2.1 - Ho scoperto che può ricordare i vecchi percorsi della struttura e utilizzare il percorso sbagliato.
+0

Grazie per l'aiuto! 1. Verificato: indica la posizione sdk 3.2.1. 2. I percorsi di ricerca quadro sono simili a questo: $ (ereditato), "$ (SRCROOT)". Ho spostato la vecchia copia di 3.1 prima di installare 3.2.1. Inoltre, il mio codice utilizza la nuova funzionalità FBWebDialogs 3.2.1 che presumo non funzionerebbe se xcode fosse collegato nella versione precedente? –