2015-04-01 10 views
-1

Итак - у меня идентичный код AFNetworking, который при запуске на симуляторе возвращает результаты, как ожидалось, и возвращает мне все надлежащее JSON.AFNetworking 401 на устройстве, работающем на симуляторе

Вскоре, когда я запустил его на устройстве, я получил 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]; 
+0

Вы используете HTTPS? Это самозаверяющий сертификат? –

ответ

0

Вы можете попробовать это, я делаю это все время

#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 
     }]; 
1

Одно различие будет то, что вы сообщаете другой идентификатор устройства. Возможно, API, который вы используете, отслеживает идентификаторы устройств, которые были авторизованы. И ваш Mac был авторизован, но у устройства iOS нет.

Вы можете попробовать зарегистрировать идентификатор устройства на Mac, а затем изменить свой код, чтобы использовать этот идентификатор в виде строки жесткого кода, вместо того, чтобы использовать то, что возвращает iPhone.

0

Вы используете схему аутентификации, которая зависит от времени? Я видел дрейф на симуляторе, который вызывает его 401.