現在、私はiosでブロックを使用して石鹸のWebサービスを使用しています。私のソースコードは次のとおりです。
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);
}
コンソールで次のエラーが発生します@コンソール
NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
URL接続にエラーがあり、エラーは:Error Domain = NSURLErrorDomain Code = -1202 "このサーバーの証明書は無効です。" www.xxxxxxxx.net "のふりをしているサーバーに接続している可能性があります。機密情報を危険にさらしてください。」 UserInfo = 0x10948bbb0 {NSUnderlyingError = 0x109470d10「このサーバーの証明書は無効です。機密情報を危険にさらす可能性がある「www.xxxxxx.net」のふりをしているサーバーに接続している可能性があります。」、NSErrorFailingURLStringKey = https: // www .----------------------------------、NSErrorFailingURLKey = https:// ----- -------------------- NSLocalizedRecoverySuggestion =それでもサーバーに接続しますか?、NSURLErrorFailingURLPeerTrustErrorKey =、NSLocalizedDescription =このサーバーの証明書は無効です。機密情報が危険にさらされる可能性のある「www.xxxxxx.net」になりすましているサーバーに接続している可能性があります。}
サーバーがスローしています[〜#〜] ssl [〜#〜]証明書エラー。テストのために、次のコードをappDelegateに追加できます:+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)Host { return YES; }
これはSSLエラーをバイパスします
注:NSURLConnectionとUIWebViewでは機能しますが、WKWebViewでは機能しません
編集:
IOS 9の場合、上記の手順は機能しません。次のスニペットをinfo.plistに追加します。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
ServiceURLでhttpsスキームを使用していて、テストサーバーでSSL証明書に問題があると思います。信頼できる場合は、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];
}
デリゲートにNSURLConnection
を初期化するには、たとえばinitWithRequest:delegate:startImmediately:
方法。
IOS 9.0では、以下をinfo.plistに追加します
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>
デリゲートが実際に呼び出されていることを確認してください。
このドキュメントでは、デリゲートが特定の状況で呼び出されない場合があることを説明しています。
重要:サーバーの応答にWWW-Authenticateヘッダーが含まれていない限り、URLロードシステムクラスは、デリゲートを呼び出してリクエストチャレンジを処理しません。プロキシ認証やTLS信頼検証などの他の認証タイプでは、このヘッダーは必要ありません。