SlideShare a Scribd company logo
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の作成
レストラン検索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";

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

}
動かしてみる
NSURLConnection(非同期)
リクエスト(NSURLRequest)を作成

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

結果をDelegateで、受け取る。
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
NSURLConnectionでリクエストを発行する。

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

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

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

- 全部のレスポンスが返されたら、
connectionDidFinishLoadingが呼ばれます。
レスポンス受け取り用に、
NSURLConnectionDelegateプロトコルを継承してお
きます。

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

Screen1ViewController.h
NoUseStoryBoard

!
#import <UIKit/UIKit.h>
!

@interface Screen1ViewController : UIViewController <NSURLConnectionDelegate>
{
@private
NSMutableData *mutableData;
}

!

@end
レスポンス受け取り用のメンバ変数の初期化。

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);
}
動かしてみる
NSURLSession
HTTPを介してコンテンツをダウンロードするAPI

iOS7以上で利用可能

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

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

NSURLSessionConfiguration 接続の設定

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


 ↓

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

 ↓

NSURLSessionTask リクエスト

 +

NSURLSessionDelegate リクエストの結果を処理
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];
}
NSURLSessionTaskとDelegate
タスク
NSURLSessionTask

説明

基底クラス

バックグラウンド

対応Delegate

-

NSDataオブジェクトを使用してデータを送受信
します。データタスクは、多 くの場合はインタ
ラクティブな、アプリケーションからサーバへの
NSURLSessionDataTask

短いリクエストを対象として います。データタ
スクは、データの各部分が受信された後に一度に

×

NSURLSessionTaskDelegate

一部分ずつ、または完了ハンドラによって一括し
て、アプリケーションにデータを返すことができ
ます。

NSURLSessionUploadTask

NSURLSessionDownloadTask

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

アップロードタスクは は、(通常はファイルの形
で)データを送信する。

○

○

NSURLSessionTaskDelegate

NSURLSessionDownloadTaskD
elegate
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);
}
}
動かしてみる

More Related Content

PDF
Ansibleで味わうHelion OpenStack
PDF
OpenStack & Ansible で実現する自動化
KEY
おしべめしべ
PDF
Ansible quickstart
PDF
OpenStack Osloを使おう - cliff編
PDF
インフラ自動構築エンジン "Ansible"の勘所を1日でつかむ ~基礎入門編~
PPT
初めての REST - Representational State Transfer
PDF
Ansible2とOpenStackの関係
Ansibleで味わうHelion OpenStack
OpenStack & Ansible で実現する自動化
おしべめしべ
Ansible quickstart
OpenStack Osloを使おう - cliff編
インフラ自動構築エンジン "Ansible"の勘所を1日でつかむ ~基礎入門編~
初めての REST - Representational State Transfer
Ansible2とOpenStackの関係

What's hot (16)

PDF
運用の現場での監視運用ツールの活用
PPTX
shinken monitoringについて真剣に調べてみた結果
PDF
Service worker が拓く mobile web の新しいかたち
PDF
Ansible ネットワーク自動化チュートリアル (JANOG42)
PPTX
20061122
PDF
Ansible handson ood2016
PDF
elasticsearchプラグイン入門
PDF
2014/11/08 第3回 一撃サーバー構築シェルスクリプト勉強会(懇親会もあるよ!) 発表資料
PDF
Mysql+Mroongaで全文検索
PDF
MailFluteでメール送信を楽しもう!
PPTX
初心者向けMongoDBのキホン!
PDF
オンプレを少しずつコンテナ化する
PDF
Mroongaを選んだ理由と
ちょっと嬉しかった話
PDF
OpenStack を NetApp Unified Driver と NFS Copy Offload を使って拡張する Vol.002
PPTX
Zabbixを2分でインストール
PDF
Spring bootでweb 基本編
運用の現場での監視運用ツールの活用
shinken monitoringについて真剣に調べてみた結果
Service worker が拓く mobile web の新しいかたち
Ansible ネットワーク自動化チュートリアル (JANOG42)
20061122
Ansible handson ood2016
elasticsearchプラグイン入門
2014/11/08 第3回 一撃サーバー構築シェルスクリプト勉強会(懇親会もあるよ!) 発表資料
Mysql+Mroongaで全文検索
MailFluteでメール送信を楽しもう!
初心者向けMongoDBのキホン!
オンプレを少しずつコンテナ化する
Mroongaを選んだ理由と
ちょっと嬉しかった話
OpenStack を NetApp Unified Driver と NFS Copy Offload を使って拡張する Vol.002
Zabbixを2分でインストール
Spring bootでweb 基本編
Ad

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

PDF
[使い倒し]GitHubのIssueとTFS/VSOのWorkItem連動に挑む(2015/08/26)
PDF
Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会
PDF
Getting started with Handoff
PDF
Weeyble async 181009_tukky
PDF
iOS WebView App
PPTX
13016 n分で作るtype scriptでnodejs
PDF
5分でわかったつもりになるParse.com
PDF
TestFlight自動化でらくらくチームテスト
PDF
Using SockJS(Websocket) with Sencha Ext JS
PDF
初めての Data API CMS どうでしょう - 仙台編 -
PDF
CleanArchitecture with AssemblyDefinition in unity
PDF
Swift + JSON via WordPress
PDF
Web socketドロンくん その後-
PDF
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
PPTX
Spring Integration 超入門
PDF
勉強会force#3 iOSアプリ開発
PDF
プロキシーを使ってテストを楽にする
PDF
Ios corebluetooth beginner
PDF
Wolcome to swift
PPTX
20120425
[使い倒し]GitHubのIssueとTFS/VSOのWorkItem連動に挑む(2015/08/26)
Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会
Getting started with Handoff
Weeyble async 181009_tukky
iOS WebView App
13016 n分で作るtype scriptでnodejs
5分でわかったつもりになるParse.com
TestFlight自動化でらくらくチームテスト
Using SockJS(Websocket) with Sencha Ext JS
初めての Data API CMS どうでしょう - 仙台編 -
CleanArchitecture with AssemblyDefinition in unity
Swift + JSON via WordPress
Web socketドロンくん その後-
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
Spring Integration 超入門
勉強会force#3 iOSアプリ開発
プロキシーを使ってテストを楽にする
Ios corebluetooth beginner
Wolcome to swift
20120425
Ad

More from 聡 大久保 (20)

PPTX
Oculus Interaction SDK で物をつかむ編
PPTX
Oculus Interaction SDK でグラブまわりの設定方法
PPTX
空間を認識する - 取り込みから表示まで -
PPTX
Photon Fusionのはじめの一歩
PPTX
Hololens2 MRTK2.7(OpenXR) でのビルド環境構築(環境設定からビルドまで)
PPTX
Hololens2でアカウント情報の取得
PPTX
HoloLens2とPCで、WebRTCで映像をやりとり
PPTX
UnityでVRアプリ(Android Cardboard)を作る -準備編-
PPTX
VRでのUI設計のヒント
PPTX
ハードサーフェイスモデリング勉強会(Blender2.79b編)
PPTX
Google Tangoで 現実世界を感じてみよう
PPTX
仮想マシンを仮想空間で見る Cloud roadshow
PPT
AWSのEC2の複数インスタンスからファイルを共有する方法
PPTX
Awsで構築したのだよ 06 ec2インスタンス起動時にCloudWatchのアラームを追加する
PPTX
Awsで構築したのだよ 05 プロセス監視、メモリ使用率、ディスク使用率をCloudWatchのカスタムメトリクスに追加したい
PPTX
Awsで構築したのだよ 04 ec2インスタンス起動時にホスト名を変更
PPTX
Awsで構築したのだよ 03 ec2インスタンスに設定したタグをサーバから取得
PPTX
Awsで構築したのだよ 02 ec2インスタンスから自分のインスタンスidを取得
PPTX
Awsで構築したのだよ 01 ユーザのコンソール操作をログに残す
PPTX
awsを学ぶ上で必要となる前提知識(DB)
Oculus Interaction SDK で物をつかむ編
Oculus Interaction SDK でグラブまわりの設定方法
空間を認識する - 取り込みから表示まで -
Photon Fusionのはじめの一歩
Hololens2 MRTK2.7(OpenXR) でのビルド環境構築(環境設定からビルドまで)
Hololens2でアカウント情報の取得
HoloLens2とPCで、WebRTCで映像をやりとり
UnityでVRアプリ(Android Cardboard)を作る -準備編-
VRでのUI設計のヒント
ハードサーフェイスモデリング勉強会(Blender2.79b編)
Google Tangoで 現実世界を感じてみよう
仮想マシンを仮想空間で見る Cloud roadshow
AWSのEC2の複数インスタンスからファイルを共有する方法
Awsで構築したのだよ 06 ec2インスタンス起動時にCloudWatchのアラームを追加する
Awsで構築したのだよ 05 プロセス監視、メモリ使用率、ディスク使用率をCloudWatchのカスタムメトリクスに追加したい
Awsで構築したのだよ 04 ec2インスタンス起動時にホスト名を変更
Awsで構築したのだよ 03 ec2インスタンスに設定したタグをサーバから取得
Awsで構築したのだよ 02 ec2インスタンスから自分のインスタンスidを取得
Awsで構築したのだよ 01 ユーザのコンソール操作をログに残す
awsを学ぶ上で必要となる前提知識(DB)

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