2015-09-17 20 views
5

IOS9 xcodeにアップグレードしましたが、私のWebサービスの回答を取得する方法は動作しません。この部分はNSData * urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&応答エラー:&エラー]です。推奨されません。IOS 9 NSURLConnection非推奨

https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/index.html#//apple_ref/doc/uid/TP40003755

NSString *post =[[NSString alloc] initWithFormat:@"lang=%@&type=ssss",@"en"]; 
NSURL *url=[NSURL URLWithString:@"http://www.xxxxxxxxxx.com/xxxxxxx/ws/get_xxxxx.php"]; 
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
NSLog(@"esta es la url: %@", postData); 
NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]]; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
[request setURL:url]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody:postData]; 
NSError *error = [[NSError alloc] init]; 
NSHTTPURLResponse *response = nil; 
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

if ([response statusCode] >=200 && [response statusCode] <300) 
{ 
    NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:urlData options:kNilOptions error:&error]; 
    NSInteger success = [(NSNumber *) [jsonData objectForKey:@"success"] integerValue]; 
    if(success == 1) 
    { 
     if (self.lugares != nil) { 
      self.lugares = nil; 
     } 
     self.lugares = [[NSMutableArray alloc] initWithArray:[jsonData objectForKey:@"lugares"]]; 
    } 
    else 
    { 
     NSLog(@"no hay datos :C"); 
    } 
} 
else 
{ 
    NSLog(@"No encontrado"); 
} 
+2

スイッチ(https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSession_class/)。 – Adam

+0

なぜiOS 8のサポートは既に終了していますか? – rmaddy

+0

[NSURLSession/NSURLConnection HTTPロードがiOS 9で失敗しました]の複製が可能です(http://stackoverflow.com/questions/30739473/nsurlsession-nsurlconnection-http-load-failed-on-ios-9) – Gruntcakes

答えて

12

あなたの実際の問題はNSURLConnectionの使用ではありません.ios9はそれを否認しても処理します。ここではios9 appleから使用しているHTTPリクエストの問題は、ATS(App Transport Security)あなたは、あなたのプロジェクトのinfo.plist

にこのキーを追加することで、これをバイパスすることができ

"App Transport Security (ATS) enforces best practices in the secure connections between an app and its back end. ATS prevents accidental disclosure, provides secure default behavior, and is easy to adopt; it is also on by default in iOS 9 and OS X v10.11. You should adopt ATS as soon as possible, regardless of whether you’re creating a new app or updating an existing one.

If you’re developing a new app, you should use HTTPS exclusively. If you have an existing app, you should use HTTPS as much as you can right now, and create a plan for migrating the rest of your app as soon as possible. In addition, your communication through higher-level APIs needs to be encrypted using TLS version 1.2 with forward secrecy.

If you try to make a connection that doesn't follow this requirement, an error is thrown. If your app needs to make a request to an insecure domain, you have to specify this domain in your app's Info.plist file."

:アップルのドキュメントから

[NSURLSession]へ

stack overflow linkとブログの参照リンク ios9 ATS

2

推奨されていません何かが動作しないという意味ではありません。 NSURLConnectionはまだiOS9で動作します。

あなたはHTTPを使用していますが、iOS9ではHTTPSを使用するはずです。 HTTPSに切り替え(推奨)、ATSを無効にする。

ATS == Apple Transport Security。

+0

私はそれを言ったことはありません。 OPがそれを使用し続けているかどうかは、問題とは無関係です。 – Gruntcakes

+0

真実、そしてタイプミスがあったので、それは賛成でした。私はちょうど私のコメントを追加していた。それをキャッチするためにありがとう。 – zaph