Pregunta Error NSURLErrorDomain -1012


Necesito analizar un archivo xml desde una URL protegida con contraseña. Intenté lo siguiente

NSURLCredential *credential = [NSURLCredential credentialWithUser:@"admin"  password:@"123456" persistence:NSURLCredentialPersistenceForSession];
NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc]
                                         initWithHost:@"xyz.com"
                                         port:80
                                         protocol:@"http"
                                         realm:nil
                                         authenticationMethod:NSURLAuthenticationMethodDefault];  
[[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential
                                             forProtectionSpace:protectionSpace];    
url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"GET"];
[request setValue:@"application/xml" forHTTPHeaderField:@"Content-Type"];
connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
NSURLResponse *response;
NSError *error;
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse: &response error: &error];   
 NSString *dataStr=[[NSString alloc]initWithData:returnData encoding:NSUTF8StringEncoding]; 
 NSLog(@"data == %@\n error in connecting == %@",dataStr,error);

Recibí la siguiente respuesta

data == <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>401 Authorization Required</title>
</head><body>
<h1>Authorization Required</h1>
<p>This server could not verify that you
are authorized to access the document
requested.  Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.</p>
<p>Additionally, a 401 Authorization Required
error was encountered while trying to use an ErrorDocument to handle the request.</p>
</body></html>

error al conectar == Dominio de error = NSURLErrorDomain Code = -1012 "La operación no se pudo completar. (NSURLErrorDomain error -1012.)" UserInfo = 0x6e51b90 {NSErrorFailingURLKey =http://example.com/api/ID/password/xml/,

¡Cualquier ayuda es apreciada!


9
2017-07-23 06:05


origen


Respuestas:


Mientras usas un NSURLRequest para acceder a un servidor, los métodos delegados de NSURLConnection provee un manera de ser notificado cuando un la autenticación es desafiada.

Esta muestra a continuación mostrará un enfoque para manejar las URL que solicitan credenciales.

- (void)CallPasswordProtectedWebService
{
 NSURL *url = [NSURL URLWithString:@"your url"];
 NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];
urlConnection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];
}

//when server asks the credentials this event will fire

 - (void)connection:(NSURLConnection *)connection 
  didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{

 if ([challenge previousFailureCount] == 0) {
    NSURLCredential *newCredential;
    newCredential=[NSURLCredential credentialWithUser:@"username"                                               password:@"password"                                              persistence:NSURLCredentialPersistenceNone];
    [[challenge sender] useCredential:newCredential
           forAuthenticationChallenge:challenge];
} else {
    [[challenge sender] cancelAuthenticationChallenge:challenge];
}
}

//when connection succeeds this event fires

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
 NSLog(@"Successfuly connected ");  

}

//when connection fails the below event fires 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
 NSLog(@"connection failed");

}

Espero que esto ayude


5
2017-07-29 09:23



En mi caso el el problema fue causado por un firewall / proxy que requiere un certificado de cliente para todas las llamadas HTTPS. Resolví este problema al proporcionar una subclase NSURLProtocol para manejar los desafíos de autenticación y proporcionar este certificado.

[NSURLProtocol registerClass:self];

//implement these methods
- (void)didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;

- (void)resolveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge withCredential:(NSURLCredential *)credential;

1
2018-03-03 15:30



Con Xcode 6, mi aplicación no descargaría una gran cantidad de archivos en las plataformas IOS 8 aunque funcionó bien en iOS anteriores. Mi código era esencialmente como lo tienes a continuación, pero el error seguía apareciendo cuando surgía un desafío de autenticación.

Tuve que cambiar el código a

 if ([challenge previousFailureCount] == 0) {
    NSURLCredential *newCredential;
    newCredential=[NSURLCredential credentialWithUser:@"username"                                               password:@"password"                                              persistence:NSURLCredentialPersistenceForSession];
    [[challenge sender] useCredential:newCredential
           forAuthenticationChallenge:challenge];
} else {
   NSURLCredential *newCredential;
    newCredential=[NSURLCredential credentialWithUser:@"username"                                               password:@"password"                                              persistence:NSURLCredentialPersistenceForSession];
    [[challenge sender] useCredential:newCredential
           forAuthenticationChallenge:challenge];
}

Lo cual, por supuesto, hace que la declaración IF sea superflua (se puede eliminar). No tengo ninguna explicación pero sin responder al desafío con nombre de usuario y contraseña, incluso en una sesión persistente provoca un error (-1012). Ahora funciona como en el IOS anterior


0
2017-09-30 16:01