Ответ 1
Я создал подкласс 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 - это частный mathod, который использует
AFOAuthManager
для обновления токена. - //3: В этом случае мы повторно авторизованы с успехом, и мы хотим повторно отправить копию предыдущего запроса. Метод
requestByAddingHeadersToRequest:
просто скопирует все поля заголовка из предыдущего запроса. - //4: Создаем копию предыдущего запроса, но на этот раз последний параметр является ложным, потому что мы не хотим снова проверять!
successBlock
иfailureBlock
совпадают с предыдущим запросом. - //5: добавьте операцию в очередь.
- //6: Если метод reauthorize выходит из строя, просто вызовите блок сбоя.