AFNetworking 401 на устройстве, работает на симуляторе
Итак, у меня есть идентичный код AFNetworking, который при запуске на симуляторе возвращает результаты, как и ожидалось, и возвращает мне все необходимое JSON.
Вскоре, когда я запускаю его на устройстве, я получаю 401. Теперь я понимаю, что это означает "неавторизованный", но как он работает на симуляторе абсолютно плавно, а затем дает мне 401 на устройстве?
Код приведен ниже и был изменен только для удаления адреса нашего API, который должен оставаться закрытым.
phoneNumber = phoneNumberField.text;
[[NSUserDefaults standardUserDefaults] setObject:phoneNumber forKey:@"phone_number"];
NSString *UDIDstring = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
NSLog(@"UDID: %@",UDIDstring);
NSString *jsonRequest = [NSString stringWithFormat:@"{\"userId\":\"%@\",\"userType\":\"%@\",\"deviceId\":\"%@\",\"deviceType\":\"%@\"}",phoneNumberField.text,@"Number",UDIDstring,@"iPhone"];
NSLog(@"json: %@",jsonRequest);
NSDictionary *stuff = [[NSDictionary alloc] initWithObjectsAndKeys:
phoneNumberField.text, @"userId",
@"Number", @"userType",
UDIDstring,@"deviceId",
@"iPhone",@"deviceType",
nil];
NSLog(@"stuff: %@",stuff);
NSError *error;
NSData *postData = [NSJSONSerialization dataWithJSONObject:stuff options:0 error:&error];
NSString *urlString = @"(hidden for privacy reasons)"
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]
cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
NSString *userpass = [@"vclient:VastV1" base64EncodedString];
NSLog(@"userpass: %@",userpass);
[request setHTTPMethod:@"POST"];
[request setValue:[NSString stringWithFormat:@"Basic: %@",userpass] forHTTPHeaderField:@"Authorization"];
//[request setValue:@"*/*" forHTTPHeaderField:@"Accept"];
[request setValue: @"application/json" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
securityPolicy.allowInvalidCertificates = YES;
op.securityPolicy = securityPolicy;
op.responseSerializer = [AFJSONResponseSerializer serializer];
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON responseObject: %@ ",responseObject);
[infoLabel setText:@"You have been sent an activation code to the number you used. Please enter it above."];
[signupLabel setText:@"your code:"];
[mainButton setTitle:@"Activate" forState:UIControlStateNormal];
firstSignup=true;
[phoneNumberField setText:@""];
[phoneNumberField setPlaceholder:@"Enter activation code."];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", [error localizedDescription]);
}];
[op start];
3 ответа
Одним из отличий будет то, что вы сообщаете другой идентификатор устройства. Возможно, используемый вами API отслеживает авторизованные идентификаторы устройств. И ваш Mac был авторизован, а устройство iOS - нет.
Вы можете попробовать зарегистрировать идентификатор устройства на Mac, а затем изменить свой код, чтобы использовать этот идентификатор в качестве жестко закодированной строки вместо того, чтобы использовать то, что возвращает iPhone.
Используете ли вы схему аутентификации, которая зависит от времени? Я видел дрейф на симуляторе, который приводит к 401.
Вы можете попробовать это, я делаю это все время
#import "AFNetworking.h"
NSDictionary *params = @{ @"key1": txtBox1.text, @"key2", txtbox2.text};
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
AFJSONRequestSerializer *serializerRequest = [AFJSONRequestSerializer serializer];
AFJSONResponseSerializer *serializerResponse = [AFJSONResponseSerializer serializer];
[serializerRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]];
serializerResponse.acceptableContentTypes = [NSSet setWithObject:@"application/json"];
manager.requestSerializer = serializerRequest;
manager.responseSerializer = serializerResponse;
[manager.securityPolicy setAllowInvalidCertificates:YES];
[manager POST:@"url"
parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject) {
// DO WHAT YOU WANT IF SUCCESSED
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// DO WHAT YOU WANT IF FAILED
}];