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

投稿者 まる

Twitter : @dinagon Instagram : @d_dinagon フォロバします!!最近、ESP/Arduinoいじりすぎでアプリ開発が進んでない。歯医者なのに歯のことはあまり触れませんw