質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

6回答

3986閲覧

Objective-CでのHTTPプロトコル通信で応答データがすぐに返らないテストサーバがある。

Satochan24

総合スコア113

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2015/06/05 05:54

iPhoneアプリ開発で、Objective-Cを使っています。

サーバにログインする処理で、以下のようなHTTPプロトコルで通信しています。
(書籍に載っていた一般的な内容です。)
//HTTPプロトコルで接続する
NSURL *url = [NSURL URLWithString:urlLogin];
NSURLRequest *req = [NSURLRequest requestWithURL:url];
NSHTTPURLResponse *res;
NSData *contents = [NSURLConnection sendSynchronousRequest:req returningResponse:&res error:nil];
NSString *str = [[NSString alloc] initWithData:contents encoding:NSUTF8StringEncoding];
_label1.text = str

・実サーバの場合は、この通信でサーバから応答がcontentsに来ているのですが、テスト用サーバでアドレスだけ変えて行うとcontentsはnilとなり、デバッグ用のラベルlabel1には何も表示されません。
・しかし、次の画面に遷移して(本当はログイン処理で応答がなければ遷移させるべきではありませんが。。。)もう一度、ログイン画面に戻ると、今度はcontenntsにもデータが入って、ラベルlabel1にも表示されます。
・何か、原因や対策等ありますでしょうか?
・実サーバとテストサーバは物理的に別のサーバとのことです。
・サーバ側はPHPで処理されているので、試しにPCのブラウザから同じアドレスでそれぞれ、テスト、実サーバにアクセスしたら、両方とも応答データが表示されました。
・PCでは両方、接続可能、iPhoneだと、テストサーバのみ応答が返ってこないことになります。
・何か、上記の通信処理で対応策等ありますでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

自己解決

URLRequestを拡張するやり方(カテゴリ)で無事テストサーバに接続成功。
(参考にしたサイト)
http://dev.classmethod.jp/smartphone/iphone/ios-nossl/

投稿2015/06/05 09:14

Satochan24

総合スコア113

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こちらのサイトはデリゲートを使って通信してますね。
他のサイトでもデリゲートを使った方が良いとでてますね。

投稿2015/06/05 08:38

MasaakiIrie

総合スコア1021

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Satochan24

2015/06/05 09:12

解決しました! さっきのサイトのデリゲートのやり方だとうまくいかなかったので、下記サイトを参考にして、URLRequestを拡張するやり方(カテゴリと呼ぶのでしょうか)で無事テストサーバに接続できました。ありがとうございました。 http://dev.classmethod.jp/smartphone/iphone/ios-nossl/
guest

0

署名が違うのかもしれませんね。
コネクションをオーバーライドするとなんとかなるみたいです。
もう1つの手は署名をシミュレーターにドラッグ&ドロップでインストール可能みたいです。

投稿2015/06/05 06:52

MasaakiIrie

総合スコア1021

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Satochan24

2015/06/05 07:09

実サーバとテスト用ではSSL証明書が正規かどうかの違いはあると思います。一応、下記サイトのような対策は入れているはずなのですが。。。 http://kechanzahorumon.hatenadiary.com/entry/2014/03/10/182628 他にオーバーロードする方法等ありますでしょうか? 使っているのはシュミレータではなく、検証用のiPhone5S実機です。
Satochan24

2015/06/05 07:53

1行づつトレースしてみると、contentsのデータ取得失敗後に、connectのオーバーロードを見にいってるようでした。それで、その後画面を戻って再度ログインすると、contentsのデータ取れてこれるようです。何か順番を操作できればいいのですが。。。
guest

0

すみません。
NSError *err;でした。 NSが抜けてました。

投稿2015/06/05 06:29

MasaakiIrie

総合スコア1021

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Satochan24

2015/06/05 06:37

そうですよね。Objective-Cは、ほとんどNSから始まりますよね。すみません。自分も初心者で気付きませんでした。 実行できたのですが、エラーは、NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9843) SSLの対策は既にやっていて実サーバでは成功しているのですが。。。実サーバとテストサーバでSSLの内容が違うのでしょうか?
guest

0

Error *err;
これを定義しないとだめですよ><

[NSURLConnection sendSynchronousRequest:req returningResponse:&res error:&err];
これでいかがでしょう?

投稿2015/06/05 06:12

MasaakiIrie

総合スコア1021

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Satochan24

2015/06/05 06:20

定義はさっきもやってみたのですが、やはり怒られました。 Error *err; NSData *contents = [NSURLConnection sendSynchronousRequest:req returningResponse:&res error:&err]; そもそもErrorで認識されません。何かインポートが必要でしょうか?
guest

0

[NSURLConnection sendSynchronousRequest:req returningResponse:&res error:nil];

error引数に Error *err;こいつを渡してあげれば、
errにエラー理由が返ってくると思います。

なにもなければ、なんでしょうね・・・?

投稿2015/06/05 06:00

MasaakiIrie

総合スコア1021

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Satochan24

2015/06/05 06:09

回答ありがとうございます。引数の渡し方がうまくいきませんでした。 [NSURLConnection sendSynchronousRequest:req returningResponse:&res error:Error *err]; にしたら、errが定義されていないと怒られました。何か渡し方が違うのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問