Facebook iOS SDK 3.2.1 - [NSError fberrorShouldNotifyUser]: непризнанный селектор, отправленный в экземпляр

Я только что обновил приложение от iOS SDK от 3.1 до 3.2.1, и я пытаюсь воспользоваться новой обработкой ошибок, предоставляемой новой категорией FBError на NSError. Код находится внизу. Он компилируется нормально, но когда возникает ошибка FB, во время выполнения я получаю следующее:

- [NSError fberrorShouldNotifyUser]: unrecognized selector sent to instance

Это похоже на ошибку компоновщика, где категория не связана с статической библиотекой FacebookSDK. Я попытался добавить флаги -ObjC и -all_load под другими флагами компоновщика в целевом объекте. Я прочитал это: http://developer.apple.com/library/mac/#qa/qa1490/, но все равно не повезло.

В принципе, тот же код отлично работает в примерах проектов, предоставляемых Facebook. Спасибо за любые предложения.

// 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: Друг сообщил, что я проверяю, действительно ли селектор существует в связанном двоичном файле. Я следил за инструкциями здесь, чтобы найти местоположение отладочной бинарной в поиске: Где мое приложение бинарно в XCode? Затем я нажал правой кнопкой мыши на MyApp.app и выбрал "Показать содержимое пакета". Найден двоичный файл (это был самый большой файл в списке), перетащил его в Vim и искал "fberrorShouldNotifyUser". Я не смог найти этот селектор или любой из селекторов FBError. Я также попытался очистить полученные XCode данные - до сих пор не повезло.

ОБНОВЛЕНИЕ # 2: Тут, иногда ты полностью пропускаешь очевидный ответ. Оказывается, у меня не было правильно установлен флаг -ObjC для моих отладочных сборников. Смотрите скриншот:

Missing ObjC Flag

Спасибо d.kendall за то, что я снова проверил это.

Ответ 1

Вам нужно добавить -ObjC к "другим флагам компоновщика" в ваших настройках сборки проекта.

Ответ 2

Установили ли вы 3.2.1 sdk в другой каталог (вместо перезаписывания 3.1 sdk)? Если это так, возможно, xcode связывает старую версию. Можете ли вы подтвердить путь каркаса в xcode:

  • В навигаторе проекта, где вы добавили Facebook Framework, щелкните правой кнопкой мыши → Показать в Finder и убедитесь, что он открывает местоположение 3.2.1 sdk; и,
  • В настройках вашей целевой сборки поиск "фреймворка" и проверка путей поиска по базе только включает в себя путь 3.2d sdk - я обнаружил, что он может помнить старые местоположения структуры и использовать неправильный путь.