サイトの運用だけではく、ゲームのランキングやら、データの収集やらをレンタルサーバーで賄っているので、AndroidやiOSのアプリを開発するときには、POSTでHTTP接続、サーバー処理、JSON返信という作業が常に必要だった。
いちいち記述しなくてもいい様に、独自のクラスで実装していたのだが、NSURLConnectionがdeprecatedになってNSURLSessionに変更する必要が出て、いろいろと探って見たら、こんな感じになった。
paramはPOSTに渡すDictionartyデータ。valueはデリゲードで戻る際に持たせたいデータを格納する(不要ならnil)でもいい。flagは複数のNetWorkManegerを生成したときにデリゲードで戻ってくるときに区別がつく様に固有のint値を渡せる様にした。
POSTでもGETでも渡せる様に、URLエンコードで引数を生成してある(GETは使わないため未実装ですが・・・w)
これでNSSessionはいいとしても・・・・ATSの問題が・・・次に書きます・・・
下がコード。書きなぐったので甘いかも
[obj-c]
#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
[/obj-c]