Исключение NSInvalidArgumentException из ACAccountStore при вызове [FBSession openActiveSessionWithPermissions...] на iOS 6.0 и iOS 6.0.1

С помощью 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 { ... }

Есть редкие случаи, когда этот метод выдает NSInvalidArgumentException с сообщением Access options are not permitted for this account type. The options argument must be nil., это выбрано из [ACAccountStore requestAccessToAccountsWithType:options:completion:].

Проверяя документы Apple ACAccountStore, я вижу этот комментарий для этого метода:

"Для некоторых типов учетных записей (например, Facebook) требуется словарь параметров. Этот метод генерирует исключение NSInvalidArgumentException, если для таких типов учетных записей не указан словарь параметров. И наоборот, если для типа учетной записи не требуется словарь параметров, параметры параметр должен быть равен нулю."

Apple требует, чтобы это было ноль, за исключением Facebook, но этот метод вызван из Facebook, поэтому, возможно, это ошибка - либо в Facebook, либо в iOS 6.0/.1, но я не мог найти что-либо в Интернете о этот вопрос.

Любые идеи?

Ответ 1

Я нашел работу вокруг этой ошибки. Обратите внимание, что здесь также описывается ошибка: https://developers.facebook.com/bugs/139251032898548

В SDK Facebook не выполняется нулевая проверка для возвращаемого значения accountTypeWithAccountTypeIdentifier. См. 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;
}