Facebook iOS SDK 3.2.1 - [NSError fberrorShouldNotifyUser]:无法识别的选择器发送到实例

Posted

技术标签:

【中文标题】Facebook iOS SDK 3.2.1 - [NSError fberrorShouldNotifyUser]:无法识别的选择器发送到实例【英文标题】:Facebook iOS SDK 3.2.1 - [NSError fberrorShouldNotifyUser]: unrecognized selector sent to instance 【发布时间】:2013-03-26 15:07:55 【问题描述】:

我刚刚将我的应用程序从 Facebook ios SDK 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;
        
    

更新: 一位朋友建议我检查选择器是否真的存在于链接的二进制文件中。我按照此处的说明在查找器中找到了调试二进制文件的位置:Where is my application binary in XCode? 然后,我右键单击 MyApp.app 并选择“显示包内容”。找到二进制文件(它是列表中最大的文件),将其拖入 Vim 并搜索“fberrorShouldNotifyUser”。我找不到这个选择器或任何 FBError 选择器。 我还尝试清除 XCode 的派生数据 - 仍然没有运气。

更新#2: 呃,有时你完全错过了明显的答案。事实证明,我没有为我的调试版本正确设置 -ObjC 标志。见截图:

感谢 d.kendall 让我再次检查。

【问题讨论】:

【参考方案1】:

您需要在项目的构建设置中将 -ObjC 添加到“其他链接器标志”。

【讨论】:

感谢您的建议 - 我已经在“其他链接器标志”中尝试了 -ObjC 和 -all_load,但我仍然卡住了。 好的 - 感谢您让我再次检查。事实证明,我为调试和发布设置了标志,但不在发布的标题为“任何架构 | 任何 SDK”的子选项卡下。呃,不敢相信我以前错过了这个。谢谢!!!! 你能解释一下为什么它有帮助吗? 这为我解决了一个问题,但我也想知道为什么? 请注意,添加-ObjC 可能会增加应用程序的大小【参考方案2】:

您是否将 3.2.1 sdk 安装到不同的目录(而不是覆盖 3.1 sdk)?如果是这样,xcode 可能正在链接旧版本。您能否通过以下方式确认 xcode 中的框架路径:

    在您添加 Facebook 框架的项目导航器中,右键单击 -> 在 Finder 中显示并验证它会打开 3.2.1 sdk 位置;并且, 在目标的构建设置中,搜索“框架”并验证框架搜索路径仅包含 3.2.1 sdk 路径 - 我发现它可以记住旧框架位置并使用错误的路径。

【讨论】:

感谢您的帮助! 1. 已验证 - 它指向 3.2.1 sdk 位置。 2. 框架搜索路径如下所示:$(inherited), "$(SRCROOT)"。在安装 3.2.1 之前,我删除了 3.1 的旧副本。另外,我的代码正在使用新的 3.2.1 FBWebDialogs 东西,如果 xcode 在旧版本中链接,我认为这些东西不起作用?

以上是关于Facebook iOS SDK 3.2.1 - [NSError fberrorShouldNotifyUser]:无法识别的选择器发送到实例的主要内容,如果未能解决你的问题,请参考以下文章

Facebook iOS SDK 3.2.1 授权/确认授权时的空白对话框

Facebook iOS SDK 3.2.1 - [NSError fberrorShouldNotifyUser]:无法识别的选择器发送到实例

在 iOS 中抑制 Facebook SDK UIAlertView

Facebook iOS SDK 返回错误“com.facebook.sdk 错误 4”

在 Facebook-Ios-Sdk 中关闭 Facebook 会话

Facebook SDK:在IOS7上无法完成操作(com.facebook.sdk错误2)