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

 大久保 聡
目次
NSURLConnection(同期)

NSURLConnection(非同期)

NSURLSession

※ベースとなるプロジェクトをダウンロードしてください。

https:/
/github.com/ovjang/NoUseS...
WebのAPIを叩いてみる
Facebook、twitterなどで、サーバとのやりとりにWeb APIのI/F
が提供されています。APIでやりとりを行い、結果をiOSアプリ
で表示することができたら・・・・

本ハンズオンでは、認証が無くユー...
NSURLConnection(同期)
リクエスト(NSURLRequest)を作成

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

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

結果(NSURLResponse)を、受け取る。
NSURLRequestの作成
レストラン検索APIで、freewordに”ワニ”、エリア
を大阪(AREA120)で検索するためのリクエストを作
成します。
http:/
/api.gnavi.co.jp/ver1/RestSearchAPI...
NSURLConnectionでリクエストを発行する。

NSURLConnectionで、先ほど作成したリクエストを
発行します。sendSynchronousRequestメソッドを使
うことで同期処理となり、レスポンスが返却され終
わるま...
動かしてみる
NSURLConnection(非同期)
リクエスト(NSURLRequest)を作成

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

結果をDelegateで、受け取る。
NSURLRequestの作成
同期処理と同じです。

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
...
NSURLConnectionでリクエストを発行する。

NSURLConnectionで、先ほど作成したリクエストを発行し
ます。initWithRequestメソッドを使うことで非同期処理
となり、レスポンスが随時返却されます。

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

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

Screen1ViewController.h
NoUseStor...
レスポンス受け取り用のメンバ変数の初期化。

NSURLConnectionのinitWithRequestメソッドで、リクエ
ストを発行します。
- (void)viewDidLoad
{
[super viewDidLoad];
// Do...
動かしてみる
NSURLSession
HTTPを介してコンテンツをダウンロードするAPI

iOS7以上で利用可能

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

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

NSURLSessionConfiguration 接続の設定

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


 ↓

NSURLSession 接続の管理(通信処理のキ...
NSURLSession作成
//
//
//
//

Screen1ViewController.h
NoUseStoryBoard

!
#import <UIKit/UIKit.h>
!
@interface Screen1ViewCon...
NSURLSessionTaskとDelegate
タスク
NSURLSessionTask

説明

基底クラス

バックグラウンド

対応Delegate

-

NSDataオブジェクトを使用してデータを送受信
します。データタスクは、多...
NSURLSessionDataTask作成
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
// de...
NSURLSessionTaskDelegeteの実装
//
//
//
//

Screen1ViewController.h
NoUseStoryBoard

!
#import <UIKit/UIKit.h>
!

@interface ...
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
// 受信データ用

!

mutableData = ...
動かしてみる
Upcoming SlideShare
Loading in …5
×

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

5,284 views

Published on

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

Published in: Technology, Business
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,284
On SlideShare
0
From Embeds
0
Number of Embeds
55
Actions
Shares
0
Downloads
18
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

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

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

×