[iOS] NSURLConnectionのdeprecatedによるNSURLSessionの利用

サイトの運用だけではく、ゲームのランキングやら、データの収集やらをレンタルサーバーで賄っているので、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