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
      }];
Другие вопросы по тегам