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”