12

アプリをFacebookiOSSDK 3.1から3.2.1にアップグレードしたところ、NSErrorの新しいFBErrorカテゴリによって提供される新しいエラー処理を利用しようとしています。コードは下部にあります。正常にコンパイルされますが、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;
        }
    }
}

更新:友人から、セレクターがリンクされたバイナリに実際に存在するかどうかを確認するようにアドバイスされました。ここの指示に従って、ファインダーでデバッグバイナリの場所を見つけました。XCodeのアプリケーションバイナリはどこにありますか? 次に、MyApp.appを右クリックして、[パッケージの内容を表示]を選択しました。バイナリファイル(リストで最大のファイル)を見つけ、Vimにドラッグして、「fberrorShouldNotifyUser」を検索しました。このセレクターまたはFBErrorセレクターが見つかりませんでした。また、XCodeの派生データをクリアしようとしましたが、それでもうまくいきません。

更新#2:うーん、時々あなたは完全に明白な答えを逃します。デバッグビルドに-ObjCフラグが適切に設定されていなかったことがわかりました。スクリーンショットを参照してください:

ObjCフラグがありません

これをもう一度確認してくれたd.kendallに感謝します。

4

2 に答える 2

18

プロジェクトのビルド設定の「その他のリンカーフラグ」に-ObjCを追加する必要があります。

于 2013-04-04T16:53:38.737 に答える
1

(3.1 sdkを上書きするのではなく)3.2.1 sdkを別のディレクトリにインストールしましたか?その場合、xcodeが古いバージョンをリンクしている可能性があります。次の方法でxcodeのフレームワークパスを確認できますか?

  1. Facebookフレームワークを追加したプロジェクトナビゲーターで、右クリック-> Finderに表示し、3.2.1SDKの場所が開くことを確認します。と、
  2. ターゲットのビルド設定で、「フレームワーク」を検索し、フレームワーク検索パスに3.2.1 sdkパスのみが含まれていることを確認します。古いフレームワークの場所を記憶し、間違ったパスを使用する可能性があることがわかりました。
于 2013-04-01T18:22:29.137 に答える