UIWebViewを使用している時に、データを端末にダウンロードさせたい時などにURLセッション関数を使ってデータパケットを受け取る事ができる。
ただし、1回に受け取るパケット量の上限が決まっているため、大きな容量を受け取るときは、受け取ったパケットを繋ぎあわせて、データ保管を行わなければならない。
が、この処理ができると、非常にアプリの幅が広がるのでダウンロード処理を行って、公衆回線よりもwifiダウンロードが行えるエコなアプリを目指そう!
テンプレートコード
viewController.h
@interface viewController : UIViewController< NSURLSessionDelegate,NSURLSessionDataDelegate,NSURLSessionTaskDelegate >
{
float DL_size_add;
NSMutableData *receivedData;
}
viewController.m
// リクエスト開始
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];
/**
* 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];
}
0 件のコメント:
コメントを投稿