21
iOSハンズオントレーニング 通信(NSURLConnection/NSURLSession)大久保 聡

iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

Embed Size (px)

DESCRIPTION

NSURLConnection/NSURLSessionを利用して、Webからデータを取得するプログラムを学びます。

Citation preview

Page 1: iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

 大久保 聡

Page 2: iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

目次

NSURLConnection(同期)

NSURLConnection(非同期)

NSURLSession

※ベースとなるプロジェクトをダウンロードしてください。 https://github.com/ovjang/NoUseStoryBoard

Page 3: iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

WebのAPIを叩いてみるFacebook、twitterなどで、サーバとのやりとりにWeb APIのI/F

が提供されています。APIでやりとりを行い、結果をiOSアプリで表示することができたら・・・・

本ハンズオンでは、認証が無くユーザ登録だけで使える、ぐるなびWebサービスを使ってiOSからリクエストを投げて、レスポンスを受け取るところまでを、ハンズオンで実施します。

ユーザ登録が必要になります。手順は、ぐるなびWebサービスの

ホームページをご覧ください。http://api.gnavi.co.jp/api/use.html

Page 4: iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

NSURLConnection(同期)リクエスト(NSURLRequest)を作成

NSURLConnectionでリクエストを発行する。

結果が返るまで、処理がブロックされます。

結果(NSURLResponse)を、受け取る。

Page 5: iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

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"; }

Page 6: iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

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メソッドを使うことで同期処理となり、レスポンスが返却され終わるまで、処理がブロックされます。

Page 7: iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

動かしてみる

Page 8: iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

NSURLConnection(非同期)

リクエスト(NSURLRequest)を作成

NSURLConnectionでリクエストを発行する。

結果をDelegateで、受け取る。

Page 9: iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

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

Page 10: iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

NSURLConnectionでリクエストを発行する。

NSURLConnectionで、先ほど作成したリクエストを発行し

ます。initWithRequestメソッドを使うことで非同期処理となり、レスポンスが随時返却されます。

delegateで返されるレスポンスの処理を行います。

- didReceiveDataでレスポンス返却の都度、受け取ったレスポンスを保管します。

- 全部のレスポンスが返されたら、connectionDidFinishLoadingが呼ばれます。

Page 11: iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

// // Screen1ViewController.h // NoUseStoryBoard // !#import <UIKit/UIKit.h> !@interface Screen1ViewController : UIViewController <NSURLConnectionDelegate> { @private NSMutableData *mutableData; } !@end

レスポンス受け取り用に、NSURLConnectionDelegateプロトコルを継承しておきます。

データ受け取り用のメンバ変数を用意します。

Page 12: iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

- (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メソッドで、リクエストを発行します。

Page 13: iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

動かしてみる

Page 14: iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

NSURLSession

HTTPを介してコンテンツをダウンロードするAPI

iOS7以上で利用可能

設定を一箇所にまとめて記述可能

バックグラウンド(アプリが後ろに回っても)でアップロード、ダウンロード可能

Page 15: iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

基本

NSURLSessionConfiguration 接続の設定 (Cookie、Cache、HTTPヘッダー、認証、PROXYなど接続に関係する設定をまとめて設定できる。)

 ↓

NSURLSession 接続の管理(通信処理のキュー)

 ↓

NSURLSessionTask リクエスト

 +

NSURLSessionDelegate リクエストの結果を処理

Page 16: iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

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

Page 17: iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

NSURLSessionTaskとDelegateタスク 説明 バックグラウンド 対応Delegate

NSURLSessionTask 基底クラス -

NSURLSessionTaskDelegateNSURLSessionDataTask

NSDataオブジェクトを使用してデータを送受信

します。データタスクは、多 くの場合はインタラクティブな、アプリケーションからサーバへの短いリクエストを対象として います。データタスクは、データの各部分が受信された後に一度に一部分ずつ、または完了ハンドラによって一括して、アプリケーションにデータを返すことができます。

×

NSURLSessionUploadTaskダウンロードタスク は、ファイルの形でデータを受信する。

NSURLSessionDownloadTaskアップロードタスクは は、(通常はファイルの形

で)データを送信する。○

NSURLSessionTaskDelegate NSURLSessionDownloadTaskDelegate

Page 18: iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

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]; }

Page 19: iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

NSURLSessionTaskDelegeteの実装// // Screen1ViewController.h // NoUseStoryBoard // !#import <UIKit/UIKit.h> !@interface Screen1ViewController : UIViewController <NSURLSessionTaskDelegate> { @private NSMutableData *mutableData; } !@end

Page 20: iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

- (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); } }

Page 21: iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編

動かしてみる