• Like
iOSハンズオントレーニング通信(NSURLConnection/NSURLSession)編
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

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

  • 3,105 views
Published

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

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

Published in Technology , Business
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
3,105
On SlideShare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
10
Comments
0
Likes
3

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. iOSハンズオントレーニング 通信(NSURLConnection/NSURLSession)編  大久保 聡
  • 2. 目次 NSURLConnection(同期) NSURLConnection(非同期) NSURLSession ※ベースとなるプロジェクトをダウンロードしてください。 https:/ /github.com/ovjang/NoUseStoryBoard
  • 3. WebのAPIを叩いてみる Facebook、twitterなどで、サーバとのやりとりにWeb APIのI/F が提供されています。APIでやりとりを行い、結果をiOSアプリ で表示することができたら・・・・ 本ハンズオンでは、認証が無くユーザ登録だけで使える、ぐるな びWebサービスを使ってiOSからリクエストを投げて、レスポン スを受け取るところまでを、ハンズオンで実施します。 ユーザ登録が必要になります。手順は、ぐるなびWebサービスの ホームページをご覧ください。http:/ /api.gnavi.co.jp/api/use.html
  • 4. NSURLConnection(同期) リクエスト(NSURLRequest)を作成 NSURLConnectionでリクエストを発行する。 結果が返るまで、処理がブロックされます。 結果(NSURLResponse)を、受け取る。
  • 5. NSURLRequestの作成 レストラン検索APIで、freewordに”ワニ”、エリア を大阪(AREA120)で検索するためのリクエストを作 成します。 http:/ /api.gnavi.co.jp/ver1/RestSearchAPI/?keyid=0520eb3010561b785d34a9af18e126a2&freeword=%E3%83%AF%E3%83%8B &area=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"; }
  • 6. NSURLConnectionでリクエストを発行する。 NSURLConnectionで、先ほど作成したリクエストを 発行します。sendSynchronousRequestメソッドを使 うことで同期処理となり、レスポンスが返却され終 わるまで、処理がブロックされます。 - (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); }
  • 7. 動かしてみる
  • 8. NSURLConnection(非同期) リクエスト(NSURLRequest)を作成 NSURLConnectionでリクエストを発行する。 結果をDelegateで、受け取る。
  • 9. NSURLRequestの作成 同期処理と同じです。 - (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"; } レスポンス受け取り用に、NSURLConnectionDelegateプロ トコルを継承しておきます。 // // // // Screen1ViewController.h NoUseStoryBoard ! #import <UIKit/UIKit.h> ! @interface Screen1ViewController : UIViewController <NSURLConnectionDelegate> ! @end
  • 10. NSURLConnectionでリクエストを発行する。 NSURLConnectionで、先ほど作成したリクエストを発行し ます。initWithRequestメソッドを使うことで非同期処理 となり、レスポンスが随時返却されます。 delegateで返されるレスポンスの処理を行います。 - didReceiveDataでレスポンス返却の都度、受け取ったレ スポンスを保管します。 - 全部のレスポンスが返されたら、 connectionDidFinishLoadingが呼ばれます。
  • 11. レスポンス受け取り用に、 NSURLConnectionDelegateプロトコルを継承してお きます。 データ受け取り用のメンバ変数を用意します。 // // // // Screen1ViewController.h NoUseStoryBoard ! #import <UIKit/UIKit.h> ! @interface Screen1ViewController : UIViewController <NSURLConnectionDelegate> { @private NSMutableData *mutableData; } ! @end
  • 12. レスポンス受け取り用のメンバ変数の初期化。 NSURLConnectionのinitWithRequestメソッドで、リクエ ストを発行します。 - (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); }
  • 13. 動かしてみる
  • 14. NSURLSession HTTPを介してコンテンツをダウンロードするAPI iOS7以上で利用可能 設定を一箇所にまとめて記述可能 バックグラウンド(アプリが後ろに回っても)で アップロード、ダウンロード可能
  • 15. 基本 NSURLSessionConfiguration 接続の設定 (Cookie、Cache、HTTPヘッダー、認証、PROXYなど接続に関係する設定をまとめて設定できる。)  ↓ NSURLSession 接続の管理(通信処理のキュー)  ↓ NSURLSessionTask リクエスト  + NSURLSessionDelegate リクエストの結果を処理
  • 16. NSURLSession作成 // // // // Screen1ViewController.h NoUseStoryBoard ! #import <UIKit/UIKit.h> ! @interface Screen1ViewController : UIViewController <NSURLSessionTaskDelegate> ! @end - (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]; }
  • 17. NSURLSessionTaskとDelegate タスク NSURLSessionTask 説明 基底クラス バックグラウンド 対応Delegate - NSDataオブジェクトを使用してデータを送受信 します。データタスクは、多 くの場合はインタ ラクティブな、アプリケーションからサーバへの NSURLSessionDataTask 短いリクエストを対象として います。データタ スクは、データの各部分が受信された後に一度に × NSURLSessionTaskDelegate 一部分ずつ、または完了ハンドラによって一括し て、アプリケーションにデータを返すことができ ます。 NSURLSessionUploadTask NSURLSessionDownloadTask ダウンロードタスク は、ファイルの形でデータ を受信する。 アップロードタスクは は、(通常はファイルの形 で)データを送信する。 ○ ○ NSURLSessionTaskDelegate NSURLSessionDownloadTaskD elegate
  • 18. 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]; }
  • 19. NSURLSessionTaskDelegeteの実装 // // // // Screen1ViewController.h NoUseStoryBoard ! #import <UIKit/UIKit.h> ! @interface Screen1ViewController : UIViewController <NSURLSessionTaskDelegate> { @private NSMutableData *mutableData; } ! @end
  • 20. - (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); } }
  • 21. 動かしてみる