在iOS 6.0和iOS 6.0.1上调用[FBSession openActiveSessionWithPermissions ...]时从ACAccountStore抛出NSInvalidArgumentException

Kof*_*Kof 11 facebook-ios-sdk ios6

使用Facebook iOS SDK 3.1.1,我正在使用此调用执行登录 -

NSArray *permissions = [[NSArray alloc] initWithObjects: @"email", @"user_birthday", @"user_location", nil];

@try {
    return [FBSession openActiveSessionWithReadPermissions:permissions
                                              allowLoginUI:allowLoginUI
                                         completionHandler:^(FBSession *session,
                                                             FBSessionState state,
                                                             NSError *error) {
                                             [self sessionStateChanged:session
                                                                 state:state
                                                                 error:error];
                                         }];
}
@catch { ... }
Run Code Online (Sandbox Code Playgroud)

在极少数情况下,此方法会抛出NSInvalidArgumentException消息Access options are not permitted for this account type. The options argument must be nil.,这是抛出的[ACAccountStore requestAccessToAccountsWithType:options:completion:].

检查Apple的文档ACAccountStore,我看到该方法的评论:

"某些帐户类型(如Facebook)需要一个选项字典.如果没有为此类帐户类型提供选项字典,此方法将抛出NSInvalidArgumentException.相反,如果帐户类型不需要选项字典,则options参数必须为零."

除了Facebook之外,Apple要求这是零,但这种方法是从Facebook调用的,所以也许这是一个错误 - 无论是在Facebook还是在iOS 6.0/.1,但我在网上找不到关于这个问题的任何内容.

有任何想法吗?

Amb*_*xon 4

我找到了解决此错误的方法。请注意,此处也描述了该错误:https://developers.facebook.com/bugs/139251032898548

Facebook SDK 不会对 accountTypeWithAccountTypeIdentifier 的返回值进行 null 检查。请参阅https://github.com/facebook/facebook-ios-sdk/blob/master/src/FBSystemAccountStoreAdapter.m?source=c#L176

要解决此问题,您可以在尝试 facebook lgoin 之前执行以下检查:

if ([[[ACAccountStore alloc]init] accountTypeWithAccountTypeIdentifier:@"com.apple.facebook"] == nil) {
   NSLog(@"Cannot proceed, not facebook account type identifier");
   return;
}
Run Code Online (Sandbox Code Playgroud)