Я создал подкласс AFOAuth2Manager
В данном подклассе я переопределить этот метод:
- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)request
success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure {
return [self HTTPRequestOperationWithRequest:request
success:success
failure:failure
checkIfTokenIsExpired:YES];
}
вызова пользовательского метода с дополнительным параметром: checkIfTokenIsExpired
. Это необходимо для того, чтобы избежать бесконечных циклов.
Реализация этого метода направлена вперед: если нам не нужно проверять токен, просто вызовите суперкласс.
if (!checkIfTokenIsExpired) {
return [super HTTPRequestOperationWithRequest:request
success:success
failure:failure];
}
иначе мы выполняем запрос с блоком пользовательского отказа
else {
return [super HTTPRequestOperationWithRequest:request
success:success
failure: ^(AFHTTPRequestOperation *operation, NSError *error) {
if (operation.response.statusCode == ERROR_CODE_UNAUTHORIZED) { //1
[self reauthorizeWithSuccess: ^{ //2
NSURLRequest *req = [self.requestSerializer requestByAddingHeadersToRequest:request]; //3
AFHTTPRequestOperation *moperation = [self HTTPRequestOperationWithRequest:req //4
success:success
failure:failure
checkIfTokenIsExpired:NO];
[self.operationQueue addOperation:moperation]; //5
} failure: ^(NSError *error) {
failure(nil, error);
}];
}
else {
failure(operation, error); //6
}
}];
}
- // 1: проверить
http status code
, если 401 попытается автоматически переавторизоваться.
- // 2: reauthorize - частный матод, который использует
AFOAuthManager
для обновления токена.
- // 3: В этом случае мы повторно авторизованы с успехом, и мы хотим повторно отправить копию предыдущего запроса. Метод
requestByAddingHeadersToRequest:
просто скопирует все поля заголовка из предыдущего запроса.
- // 4: Создайте копию предыдущего запроса, но на этот раз последний параметр является ложным, потому что мы не хотим снова проверять!
successBlock
и failureBlock
совпадают с предыдущим запросом.
- // 5: добавьте операцию в очередь.
- // 6: Если метод reauthorize не работает, просто вызовите блок сбоя.
Вы нашли какие-либо решения? – iPeo
пока. Я реализовал свою собственную логику – IgnazioC
вы можете разместить свой образец или объяснить, что вы сделали? Я ищу то же самое. – cableload