iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編
大久保 聡
目次
NSURLConnection(同期)
NSURLConnection(非同期)
NSURLSession
※ベースとなるプロジェクトをダウンロードしてください。 https://github.com/ovjang/NoUseStoryBoard
WebのAPIを叩いてみるFacebook、twitterなどで、サーバとのやりとりにWeb APIのI/F
が提供されています。APIでやりとりを行い、結果をiOSアプリで表示することができたら・・・・
本ハンズオンでは、認証が無くユーザ登録だけで使える、ぐるなびWebサービスを使ってiOSからリクエストを投げて、レスポンスを受け取るところまでを、ハンズオンで実施します。
ユーザ登録が必要になります。手順は、ぐるなびWebサービスの
ホームページをご覧ください。http://api.gnavi.co.jp/api/use.html
NSURLConnection(同期)リクエスト(NSURLRequest)を作成
NSURLConnectionでリクエストを発行する。
結果が返るまで、処理がブロックされます。
結果(NSURLResponse)を、受け取る。
NSURLRequestの作成
http://api.gnavi.co.jp/ver1/RestSearchAPI/?keyid=0520eb3010561b785d34a9af18e126a2&freeword=%E3%83%AF%E3%83%8B &area=AREA120
レストラン検索APIで、freewordに”ワニ”、エリア
を大阪(AREA120)で検索するためのリクエストを作成します。
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ! // 送信したいURLを作成する NSString *urlString =@"http://api.gnavi.co.jp/ver1/RestSearchAPI/?keyid=0520eb3010561b785d34a9af18e126a2&freeWord=ワニ&area=AREA120"; urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:urlString]; // Mutableなインスタンスを作成し、インスタンスの内容を変更できるようにする NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // MethodにGETを指定する。 request.HTTPMethod = @"GET"; }
NSURLConnectionでリクエストを発行する。
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ! // 送信したいURLを作成する NSString *urlString =@"http://api.gnavi.co.jp/ver1/RestSearchAPI/?keyid=0520eb3010561b785d34a9af18e126a2&freeWord=ワニ&area=AREA120"; urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:urlString]; // Mutableなインスタンスを作成し、インスタンスの内容を変更できるようにする NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // MethodにGETを指定する。 request.HTTPMethod = @"GET"; NSHTTPURLResponse *httpResponse; NSError *err; /* HTTP リクエスト送信 */ NSData *contents = [NSURLConnection sendSynchronousRequest:request returningResponse:&httpResponse error:&err]; NSString *responseBody = [[NSString alloc] initWithData:contents encoding:NSUTF8StringEncoding]; NSLog(@"Response = %@", responseBody); }
NSURLConnectionで、先ほど作成したリクエストを
発行します。sendSynchronousRequestメソッドを使うことで同期処理となり、レスポンスが返却され終わるまで、処理がブロックされます。
動かしてみる
NSURLConnection(非同期)
リクエスト(NSURLRequest)を作成
NSURLConnectionでリクエストを発行する。
結果をDelegateで、受け取る。
NSURLRequestの作成同期処理と同じです。
!
!
!
レスポンス受け取り用に、NSURLConnectionDelegateプロトコルを継承しておきます。
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ! // 送信したいURLを作成する NSString *urlString =@"http://api.gnavi.co.jp/ver1/RestSearchAPI/?keyid=0520eb3010561b785d34a9af18e126a2&freeword=ワニ&area=AREA120"; urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:urlString]; // Mutableなインスタンスを作成し、インスタンスの内容を変更できるようにする NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // MethodにGETを指定する。 request.HTTPMethod = @"GET"; }
// // Screen1ViewController.h // NoUseStoryBoard // !#import <UIKit/UIKit.h> !@interface Screen1ViewController : UIViewController <NSURLConnectionDelegate> !@end
NSURLConnectionでリクエストを発行する。
NSURLConnectionで、先ほど作成したリクエストを発行し
ます。initWithRequestメソッドを使うことで非同期処理となり、レスポンスが随時返却されます。
delegateで返されるレスポンスの処理を行います。
- didReceiveDataでレスポンス返却の都度、受け取ったレスポンスを保管します。
- 全部のレスポンスが返されたら、connectionDidFinishLoadingが呼ばれます。
// // Screen1ViewController.h // NoUseStoryBoard // !#import <UIKit/UIKit.h> !@interface Screen1ViewController : UIViewController <NSURLConnectionDelegate> { @private NSMutableData *mutableData; } !@end
レスポンス受け取り用に、NSURLConnectionDelegateプロトコルを継承しておきます。
データ受け取り用のメンバ変数を用意します。
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ! // 受信データ用 mutableData = [NSMutableData new]; // 送信したいURLを作成する NSString *urlString =@"http://api.gnavi.co.jp/ver1/RestSearchAPI/?keyid=0520eb3010561b785d34a9af18e126a2&freeword=ワニ&area=AREA120"; urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:urlString]; // Mutableなインスタンスを作成し、インスタンスの内容を変更できるようにする NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // MethodにGETを指定する。 request.HTTPMethod = @"GET"; /* HTTP リクエスト送信 */ NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; if (!connection) NSLog(@"failed to create connection"); } !// データ受信時 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ [mutableData appendData:data]; } !// 完了時 - (void)connectionDidFinishLoading:(NSURLConnection *)connection { NSString *str= [[NSString alloc] initWithData:mutableData encoding:NSUTF8StringEncoding]; NSLog(@"%@",str); }
レスポンス受け取り用のメンバ変数の初期化。
NSURLConnectionのinitWithRequestメソッドで、リクエストを発行します。
動かしてみる
NSURLSession
HTTPを介してコンテンツをダウンロードするAPI
iOS7以上で利用可能
設定を一箇所にまとめて記述可能
バックグラウンド(アプリが後ろに回っても)でアップロード、ダウンロード可能
基本
NSURLSessionConfiguration 接続の設定 (Cookie、Cache、HTTPヘッダー、認証、PROXYなど接続に関係する設定をまとめて設定できる。)
↓
NSURLSession 接続の管理(通信処理のキュー)
↓
NSURLSessionTask リクエスト
+
NSURLSessionDelegate リクエストの結果を処理
NSURLSession作成
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. // defaultSessionConfiguration or backgroundSessionConfiguration NSURLSessionConfiguration *configration = [NSURLSessionConfiguration defaultSessionConfiguration]; // NSURLSessionConfigurationを指定して NSURLSession作成 NSURLSession *session = [NSURLSession sessionWithConfiguration:configration delegate:self delegateQueue:nil]; }
// // Screen1ViewController.h // NoUseStoryBoard // !#import <UIKit/UIKit.h> !@interface Screen1ViewController : UIViewController <NSURLSessionTaskDelegate> !@end
NSURLSessionTaskとDelegateタスク 説明 バックグラウンド 対応Delegate
NSURLSessionTask 基底クラス -
NSURLSessionTaskDelegateNSURLSessionDataTask
NSDataオブジェクトを使用してデータを送受信
します。データタスクは、多 くの場合はインタラクティブな、アプリケーションからサーバへの短いリクエストを対象として います。データタスクは、データの各部分が受信された後に一度に一部分ずつ、または完了ハンドラによって一括して、アプリケーションにデータを返すことができます。
×
NSURLSessionUploadTaskダウンロードタスク は、ファイルの形でデータを受信する。
○
NSURLSessionDownloadTaskアップロードタスクは は、(通常はファイルの形
で)データを送信する。○
NSURLSessionTaskDelegate NSURLSessionDownloadTaskDelegate
NSURLSessionDataTask作成- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. // defaultSessionConfiguration or backgroundSessionConfiguration NSURLSessionConfiguration *configration = [NSURLSessionConfiguration defaultSessionConfiguration]; // NSURLSessionConfigurationを指定して NSURLSession作成 NSURLSession *session = [NSURLSession sessionWithConfiguration:configration delegate:self delegateQueue:nil]; // リクエスト作成 NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com"]]; // 先に作成したNSURLSessionに対して dataTaskWithRequest: メソッドを呼び出す NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request]; // resumeで処理開始 [dataTask resume]; }
NSURLSessionTaskDelegeteの実装// // Screen1ViewController.h // NoUseStoryBoard // !#import <UIKit/UIKit.h> !@interface Screen1ViewController : UIViewController <NSURLSessionTaskDelegate> { @private NSMutableData *mutableData; } !@end
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. // 受信データ用 mutableData = [NSMutableData new]; ! // defaultSessionConfiguration or backgroundSessionConfiguration NSURLSessionConfiguration *configration = [NSURLSessionConfiguration defaultSessionConfiguration]; // NSURLSessionConfigurationを指定して NSURLSession作成 NSURLSession *session = [NSURLSession sessionWithConfiguration:configration delegate:self delegateQueue:nil]; // リクエスト作成 NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com"]]; // 先に作成したNSURLSessionに対して dataTaskWithRequest: メソッドを呼び出す NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request]; // resumeで処理開始 [dataTask resume]; } !// データ受信時 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { [mutableData appendData:data]; } !// 完了時 - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { if(error){ // エラーハンドリング }else{ NSString *str= [[NSString alloc] initWithData:mutableData encoding:NSShiftJISStringEncoding]; NSLog(@"%@",str); } }
動かしてみる