サイトの運用だけではく、ゲームのランキングやら、データの収集やらをレンタルサーバーで賄っているので、AndroidやiOSのアプリを開発するときには、POSTでHTTP接続、サーバー処理、JSON返信という作業が常に必要だった。
いちいち記述しなくてもいい様に、独自のクラスで実装していたのだが、NSURLConnectionがdeprecatedになってNSURLSessionに変更する必要が出て、いろいろと探って見たら、こんな感じになった。
paramはPOSTに渡すDictionartyデータ。valueはデリゲードで戻る際に持たせたいデータを格納する(不要ならnil)でもいい。flagは複数のNetWorkManegerを生成したときにデリゲードで戻ってくるときに区別がつく様に固有のint値を渡せる様にした。
POSTでもGETでも渡せる様に、URLエンコードで引数を生成してある(GETは使わないため未実装ですが・・・w)
これでNSSessionはいいとしても・・・・ATSの問題が・・・次に書きます・・・
下がコード。書きなぐったので甘いかも
#import "NetworkManeger.h" @implementation NetworkManeger -(void)sendserver_url_withPost:(NSString*)URL_st param:(NSDictionary*)param value:(NSDictionary*)_value flag:(int)_flag{ //デリゲートに戻すときのパラメーター value = _value; flag = _flag; // サーバーと通信(URLリクエストを作成:POST) NSURL *serviceURL = [NSURL URLWithString:URL_st]; NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:serviceURL]; [req setHTTPMethod:@"POST"]; NSMutableString *ms = [NSMutableString string]; for (id key in [param keyEnumerator]) { //NSLog(@"Key:%@ Value:%@", key, [dic valueForKey:key]); [ms appendString:key]; [ms appendString:@"="]; [ms appendString:[[param valueForKey:key] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet]]]; [ms appendString:@"&"]; } NSString *buf = [ms substringToIndex:([ms length]-1)]; //NSLog(@"%@",buf); [req setHTTPBody:[buf dataUsingEncoding:NSUTF8StringEncoding]]; // セッション作成 NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; // タイムアウトの設定 sessionConfig.timeoutIntervalForRequest = 10; sessionConfig.timeoutIntervalForResource = 10; // 通信設定 NSURLSession* session = [NSURLSession sessionWithConfiguration: sessionConfig delegate:self delegateQueue: [NSOperationQueue mainQueue]]; //データバッファの初期化 recevedData = [[NSMutableData alloc]init]; // 通信開始 NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:req]; [dataTask resume]; } // レスポンス処理 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; // Headerの情報の確認 if (httpResponse.statusCode == 200) { completionHandler(NSURLSessionResponseAllow); // 続ける } else { // error.code = -999で終了メソッドが呼ばれる completionHandler(NSURLSessionResponseCancel); // 止める } } // 受信データ処理 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { // 受信データ格納 [recevedData appendData:data]; // printf("/*%s*/\n",[[NSString stringWithFormat:@"%zd",[data length]] UTF8String]); } - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { [session invalidateAndCancel]; if (!error) { // 正常終了 NSString *str= [[NSString alloc] initWithData:recevedData encoding:NSUTF8StringEncoding]; //NSLog(@"%@",str); //NSLog(@"正常終了"); if(self.delegate==nil) return; if ([self.delegate respondsToSelector:@selector(getFinished:value:flag:)]) { //正常終了を呼び出す [self.delegate getFinished:str value:value flag:flag]; } } else { // エラー終了 /* code値 -999 : statusCodeが200以外(401など)、ユーザーキャンセル? -1200 : ATS関連(ログ参考) -1009 : 機内モード、モバイルデータ通信・wifi off */ //NSLog(@"異常終了 errorcode=%ld",error.code); if(self.delegate==nil) return; if ([self.delegate respondsToSelector:@selector(getError:value:flag:)]) { //異常終了を呼び出す [self.delegate getError:error.code value:value flag:flag]; } } } //戻りJson文字列のログ出力 +(void)LogJsonFromSt:(NSString*)r_line{ NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:[r_line dataUsingEncoding:NSUnicodeStringEncoding] options:NSJSONReadingAllowFragments error:nil]; NSLog(@"%@",jsonResponse); NSLog(@"--受信ライン-------------------"); NSLog(@"%@",r_line); NSLog(@"------------------------------"); NSLog(@"--JSON------------------------"); for (id key in [jsonResponse keyEnumerator]) { NSLog(@"Key:%@ Value:%@", key, [jsonResponse valueForKey:key]); } NSLog(@"------------------------------"); } @end