Пользователь не вошел в систему в Facebook SDK iOS - PullRequest
3 голосов
/ 22 августа 2011

Как я могу исправить эту ошибку в моей программе?Использование Facebook SDK.

Error Domain=facebookErrDomain Code=10000 "The operation couldn’t be completed. (facebookErrDomain error 10000.)" UserInfo=0x5da9b10 {error=<CFBasicHash 0x5db09a0 [0x1087400]>{type = mutable dict, count = 2,
entries =>
    2 : <CFString 0x5db7920 [0x1087400]>{contents = "type"} = <CFString 0x5d35420 [0x1087400]>{contents = "OAuthException"}
    3 : <CFString 0x5d34970 [0x1087400]>{contents = "message"} = <CFString 0x5da96b0 [0x1087400]>{contents = "Error validating access token: The session is invalid because the user logged out."}
}
}

Ответы [ 2 ]

8 голосов
/ 31 августа 2011

Я думаю, что решение enbr размещено не является полным.Я объясню, почему:

Ошибки токена доступа возвращаются, когда заканчивается сеанс Facebook, и вы продолжаете использовать старый токен доступа.Выход из системы - не единственный сценарий, в котором заканчивается сеанс (например, смена пароля для входа в Интернет).Следовательно, недостаточно просто очистить пользовательские настройки по умолчанию после выхода из системы.

Со стороны клиента мы не знаем, действителен ли у нас токен доступа, до тех пор, пока не придет ответ с такой информацией.Поэтому вам необходимо обнаружить ошибки токена доступа и восстановить работоспособность экземпляра Facebook, очистив старый токен доступа и дату истечения срока действия.Таким образом, пользователю потребуется снова войти в систему, чтобы получить новый токен доступа.

Итак, IMO, вам нужно сделать следующее:

  1. Обрабатывать ошибки и обнаруживатьпри возникновении ошибки токена доступа.

  2. При возникновении ошибки токена доступа автоматически выйдите из системы и очистите значения по умолчанию для удаления старого токена доступа (шаг 3).

  3. В результате выхода из системы вам необходимо очистить пользовательские настройки по умолчанию для токена доступа и даты истечения срока действия (как отправлено enbr).

Здесь у вас есть код, который можно использоватьдля обнаружения ошибок токена доступа:

-(BOOL)isAccessTokenError:(NSError *) error {
    if ([[error domain] isEqualToString:@"facebookErrDomain"] && [error code] == 10000 ) {
        NSDictionary *userInfo = [error userInfo];
        NSDictionary *errorAsDictionary = [userInfo objectForKey:@"error"];
        if ([[errorAsDictionary objectForKey:@"type"] isEqualToString:@"OAuthException"]) {
            //Invalid access token
            return YES;         
        }
    }
    if ([[error domain] isEqualToString:@"facebookErrDomain"] && ([error code] == 110 || [error code] == 190)) {
        //Error accessing access token
        return YES;         
    }
    return NO;
}

Места для обработки таких ошибок:

- (void)request:(FBRequest*)request didFailWithError:(NSError*)error; 
- (void)dialog:(FBDialog*)dialog didFailWithError:(NSError *)error;

Надеюсь, это поможет.

ОБНОВЛЕНИЕ: Я забыл упомянуть.Если вы используете функцию единого входа (скорее всего), я думаю, что это очень хорошая идея - очистить куки-файлы перед входом в систему.Иногда после ошибки неверного токена доступа кажется, что вход в систему не вернет объект Facebook в рабочее состояние (действительный токен доступа), если не будет выполнен «чистый вход в систему».Хотя это не всегда работает.

Кроме того, если вы не используете функцию единого входа, это использовалось для исправления всплывающего сообщения о призрачном входе в систему, которое автоматически исчезало снова.

Так я очищаю файлы cookie.:

NSHTTPCookieStorage* cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    NSArray* facebookCookies = [cookies cookiesForURL:
                                [NSURL URLWithString:@"http://login.facebook.com"]];    
    for (NSHTTPCookie* cookie in facebookCookies) {
        [cookies deleteCookie:cookie];
    }
enter code here
1 голос
/ 23 августа 2011

Я только недавно столкнулся с этой ошибкой.Вот решение.Поместите этот код в ваш основной FBSessionDelegate (вероятно, ваш делегат приложения).

- (void)fbDidLogout {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults removeObjectForKey:@"FBAccessTokenKey"];
    [defaults removeObjectForKey:@"FBExpirationDateKey"];
    [defaults synchronize];
}

Затем удалите и переустановите приложение!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...