我刚刚将我的应用程序从 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;
}
}
}
更新:一位朋友建议我检查选择器是否真的存在于链接的二进制文件中。我按照此处的说明在查找器中查找调试二进制文件的位置:XCode 中我的应用程序二进制文件在哪里? 然后,我右键单击 MyApp.app 并选择“显示包内容”。找到二进制文件(它是列表中最大的文件),将其拖入 Vim 并搜索“fberrorShouldNotifyUser”。我找不到这个选择器或任何 FBError 选择器。我还尝试清除 XCode 的派生数据 - 仍然没有运气。
更新#2:呃,有时你完全错过了明显的答案。事实证明,我没有为我的调试版本正确设置 -ObjC 标志。看截图:
感谢 d.kendall 让我再次检查。