stworzyłem podklasę AFOAuth2Manager
W tej podklasy zastąpić tę metodę:
- (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];
}
wywołanie metody niestandardowej z dodatkowym parametrem: checkIfTokenIsExpired
. Jest to wymagane, aby uniknąć nieskończonych pętli.
Implementacja tej metody jest prosta: jeśli nie musimy sprawdzać tokena, wystarczy zadzwonić do super klasy.
if (!checkIfTokenIsExpired) {
return [super HTTPRequestOperationWithRequest:request
success:success
failure:failure];
}
inaczej możemy wykonać żądania z bloku zwyczaj awarii
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: Sprawdź
http status code
, jeśli 401 próbować automatycznie ponownie-autoryzacji.
- // 2: ponowna autoryzacja to prywatna matematyka korzystająca z
AFOAuthManager
do odświeżenia tokena.
- // 3: W tym przypadku jesteśmy ponownie upoważnieni z powodzeniem i chcemy ponownie przesłać kopię poprzedniego wniosku. Metoda ta polega tylko na skopiowaniu wszystkich pól nagłówka z poprzedniego żądania.
- // 4: Utwórz kopię poprzedniego żądania, ale tym razem ostatni parametr jest fałszywy, ponieważ nie chcemy ponownie sprawdzać!
successBlock
i failureBlock
są takie same jak poprzednie żądanie.
- // 5: Dodaj operację do kolejki.
- // 6: Jeśli metoda ponownego autoryzowania się nie powiedzie, po prostu wywołaj blok awarii.
Czy znaleziono żadnych rozwiązań? – iPeo
Nie tak daleko. Zaimplementowałem własną logikę – IgnazioC
czy możesz zamieścić swoją próbkę lub wyjaśnić, co zrobiłeś? Szukam tego samego. – cableload