[Objective-C] URLSessionテンプレート

UIWebViewを使用している時に、データを端末にダウンロードさせたい時などにURLセッション関数を使ってデータパケットを受け取る事ができる。
ただし、1回に受け取るパケット量の上限が決まっているため、大きな容量を受け取るときは、受け取ったパケットを繋ぎあわせて、
データ保管を行わなければならない。
が、この処理ができると、非常にアプリの幅が広がるのでダウンロード処理を行って、公衆回線よりもwifiダウンロードが行える
エコなアプリを目指そう!
テンプレートコード
viewController.h
1 2 3 4 5 |
@interface viewController : UIViewController< NSURLSessionDelegate,NSURLSessionDataDelegate,NSURLSessionTaskDelegate > { float DL_size_add; NSMutableData *receivedData; } |
viewController.m
1 2 3 4 5 6 7 |
// リクエスト開始 NSURL *url = [NSURL URLWithString:urlEncode]; NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:root_obj delegateQueue:[NSOperationQueue mainQueue]]; NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; NSURLSessionDataTask *task = [session dataTaskWithRequest:request]; [task resume]; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
/** * HTTPリクエストのデリゲートメソッド(データ受け取り初期処理) */ - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler { // Header情報の取得 NSDictionary* headers = [(NSHTTPURLResponse *)response allHeaderFields]; NSString *str = headers[@"Content-Length"]; //ファイルの総容量 int *data_size = str.integerValue; //DLを経過容量(累積値)※グローバル変数を利用する DL_size_add = 0; // receiveDataはフィールド変数※グローバル変数を利用する receivedData = [[NSMutableData alloc] init]; //インジケーター開始 [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; // Headerの情報の確認 NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; if (httpResponse.statusCode == 200) { completionHandler(NSURLSessionResponseAllow); // 続ける } // error.code = -999で終了メソッドが呼ばれる else { completionHandler(NSURLSessionResponseCancel); // 止める } } /** * HTTPリクエストのデリゲートメソッド(受信の度に実行) */ - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { // 1つのパケットに収まらないデータ量の場合は複数回呼ばれるので、データを追加していく DL_size_add += data.length; [receivedData appendData:data]; // shelf-progress-reload [self setShelfDownloadBar]; } /** * HTTPリクエストのデリゲートメソッド(完了処理) */ - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { //インジケーター起動 [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; //終了処理 [session invalidateAndCancel]; } |