Actuellement, je consomme un service Web soap avec block dans ios, mon code source est le suivant
NSString *xml = requestXMLToSent;
NSString *msgLength = [NSString stringWithFormat:@"%lu", (unsigned long)[xml length]];
NSURL *serviceURL = [NSURL URLWithString: url];
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:serviceURL];
[urlRequest addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[urlRequest addValue: serviceURL forHTTPHeaderField:@"SOAPAction"];
[urlRequest addValue:msgLength forHTTPHeaderField:@"Content-Length"];
[urlRequest setHTTPBody: [xml dataUsingEncoding:NSUTF8StringEncoding]];
[urlRequest setHTTPMethod:@"POST"];
[NSURLConnection sendAsynchronousRequest:urlRequest queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (connectionError == NULL) {
NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *) response;
NSInteger statuscode = httpResponse.statusCode;
if (statuscode == 200) {
NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"response String : %@",responseString);
}else{
NSLog(@"%@",response);
}
}else{
NSLog(@"There is an error in URL connection and the Error is : %@",connectionError);
}
Je reçois l'erreur suivante @ console
NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
Il y a une erreur dans la connexion d'URL et l'erreur est la suivante: Error Domain = NSURLErrorDomain Code = -1202 "Le certificat de ce serveur n'est pas valide. Vous vous connectez peut-être à un serveur prétendant être" www.xxxxxxxx.net ", ce qui pourrait mettre vos informations confidentielles à risque. " UserInfo = 0x10948bbb0 {NSUnderlyingError = 0x109470d10 "Le certificat de ce serveur n'est pas valide. Vous vous connectez peut-être à un serveur prétendant être« www.xxxxxx.net », ce qui pourrait compromettre vos informations confidentielles.", NSErrorFailingURLStringKey = https: // www .----------------------------------, NSErrorFailingURLKey = https: // ----- -------------------- NSLocalizedRecoverySuggestion = Souhaitez-vous vous connecter au serveur malgré tout ?, NSURLErrorFailingURLPeerTrustErrorKey =, NSLocalizedDescription = Le certificat de ce serveur n'est pas valide. Vous vous connectez peut-être à un serveur prétendant être «www.xxxxxx.net», ce qui pourrait mettre en péril vos informations confidentielles.}
Le serveur émetSSLcertificate error . À des fins de test, vous pouvez ajouter le code suivant à appDelegate:
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)Host {
return YES;
}
Cela contournera l'erreur SSL
Note: fonctionne pour NSURLConnection & UIWebView, mais pas pour WKWebView
Édité:
Pour iOS 9, la procédure ci-dessus ne fonctionne pas. Ajoutez l'extrait suivant dans info.plist:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Je suppose que vous utilisez le schéma https dans votre serviceURL et que votre serveur de test a des problèmes avec le certificat SSL. Si tel est le cas et que vous y avez confiance, implémentez les méthodes suivantes dans votre délégué NSURLConnection
:
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
return YES;
}
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
if([challenge.protectionSpace.Host isEqualToString:@"127.0.0.1"] /*check if this is Host you trust: */ )
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
}
Pour qu'un délégué initialise votre NSURLConnection
par exemple avec la méthode initWithRequest:delegate:startImmediately:
.
Dans iOS 9.0, ajoutez les éléments suivants à info.plist.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>
Vérifiez que vos délégués sont effectivement appelés.
Cette documentation explique que vos délégués peuvent ne pas être appelés dans certaines circonstances.
Important: Les classes système de chargement d'URL n'appellent pas leurs délégués pour gérer les demandes de requêtes, à moins que la réponse du serveur ne contienne un en-tête WWW-Authenticate. D'autres types d'authentification, tels que l'authentification proxy et la validation de confiance TLS, ne nécessitent pas cet en-tête.