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

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

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

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

3回答

3235閲覧

API(HTTPS)接続した際にエラーが発生します

tn_mrmn

総合スコア16

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/02/23 07:16

編集2017/02/23 08:45

Swift初心者です。
ボタンをクリックした際にAPI接続(HTTPS)し、Javaプログラムを呼んでいます。
正常に接続できた場合、次の画面に遷移するという処理なのですが、エラーが発生します。
次の画面には遷移するのですが、Labelとかボタンの文言が消えてしまっている状態で表示されます。

「nw_socket_set_common_sockopts setsockopt SO_NOAONFALLBK failed: [42] Protocol not available, dumping backtrace: ~」

ソケットうんぬんとかプロトコルとかのエラーかと思いますが、
もしかしたらHTTPSが原因かもと考えております。

お分かりの方いらっしゃいましたらご教示いただけますと幸いです。

Swift

1@IBAction func loginButton(_ sender: Any) { 2 3 let apiURL = URL(string:"https://testapi.com")! 4 var request = URLRequest(url: apiURL) 5 request.httpMethod = "POST" 6 7 // APIに接続 8 URLSession.shared.dataTask(with: request) {data, response, err in 9 if (err == nil) { 10 11 // 通信成功 12 do { 13 // メインメニューに遷移 14 let storyboard: UIStoryboard = self.storyboard! 15 let nextView = storyboard.instantiateViewController(withIdentifier: "MainView") as! MainViewController 16 self.present(nextView, animated: false, completion: nil) 17 18 } catch { 19 20 // 通信エラー 21 let alert = UIAlertController( 22 title: "エラー", 23 message: "通信エラー", 24 preferredStyle: .alert) 25 26 alert.addAction(UIAlertAction(title: "OK", style: .default)) 27 28 self.present(alert, animated: true, completion: nil) 29 } 30 } 31 32 }.resume() 33}

ちなみにresponseで得られた結果は以下の通りとなります。

{ URL: https://testapi.com } { status code: 200, headers {
Connection = "Keep-Alive";
"Content-Length" = 208;
"Content-Type" = "application/json;charset=UTF-8";
Date = "Thu, 23 Feb 2017 08:33:50 GMT";
"Keep-Alive" = "timeout=15";
"Set-Cookie" = "JSESSIONID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX; Path=/xxxx/; Secure; HttpOnly";
Vary = "Accept-Encoding";
} }

HttpOnlyが少し気になります・・・

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

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

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

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

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

fuzzball

2017/02/23 08:29 編集

err == nil だけではなく、responseのヘッダやステータスコードも調べて下さい。
tn_mrmn

2017/02/23 08:47

コメントいただきありがとうございます。responseを出してみました。引き続き調査しますが何かお分かりでしたらご教示いただけますと幸いです。
guest

回答3

0

HTTPのステータスコードは200なので、通信そのものは成功しているように見えます。遷移後の画面でエラーになるということは、上記のコード自体は成功しているのでは無いでしょうか?その場合、表示しようとしているMainViewviewDidLoadviewWillAppearなどが怪しいと思います。

それが問題無いとすると、次のStackoverflowで挙がっている記事と同じ現象かもしれません。

Error: Protocol not available, dumping backtrace [duplicate]

投稿2017/02/24 01:00

studiork

総合スコア110

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

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

tn_mrmn

2017/02/28 08:15

ありがとうございます。 環境変数の設定に関しては既に設定済でした。 設定方法について各サイトによって異なっており、 どれが正しいのやら…と頭を悩ませている状態です。 最終的なソース、後程載せます!
guest

0

ベストアンサー

遷移するコードをメインスレッドで実行してみて下さい。

投稿2017/02/24 01:33

fuzzball

総合スコア16731

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

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

tn_mrmn

2017/02/28 08:13

どうやらそれが問題であったようです。 また、非同期で通信していた為、返り値が返ってくる前に判定しており、正確に判定ができておりませんでした。 同期通信に変更したら成功しました! メインスレッドとかいう概念があるのですね…初めて知りましたが、 それがヒントとなりました。ありがとうございます! ソースは後程記載致します。
guest

0

最終的にはこのようになりました。
同期通信です。
アドバイスいただきましてありがとうございました。

Swift

1 @IBAction func loginButton(_ sender: Any) { 2 3 let config: URLSessionConfiguration = URLSessionConfiguration.background(withIdentifier: "backgroundTask") 4 let session: URLSession = URLSession(configuration: config, delegate: self, delegateQueue: nil) 5 let url: NSURL = NSURL(string:"https://testapi.com")! 6 let task: URLSessionDataTask = session.dataTask(with: url as URL) 7 task.resume() 8 } 9 10 func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) { 11 12 var returnCode: String = "" 13 14 do { 15 16 let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [NSString : AnyObject] 17 18 if let result_number = json["returnCode"]! as? NSNumber 19 { 20 returnCode = "\(result_number)" 21 } 22 } catch { 23 24 } 25 } 26

ただ、urlSessionの中でポップアップ出す時にエラーが発生する・・・
メインスレッドでやれというエラーっぽかったですが、どの関数使ってもコンパイルエラー・・・

なぜ皆さんのように上手くいかない・・・
気長にやっていきたいと思います。

投稿2017/02/28 08:24

tn_mrmn

総合スコア16

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

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

fuzzball

2017/02/28 08:31

//メインスレッドで実行 DispatchQueue.main.async { //この中はメインスレッド } あと、同期通信はやめた方がいいです。 ここにはこれ以上コメント/回答しませんので悪しからず。
tn_mrmn

2017/02/28 08:38

それでいけました! 他のサイトではもうちょっと難しい書き方をしていたので、 全然コンパイル通らなかったのです・・・ありがとうございます!! 同期通信がいけない… ちょっと気になりますが、同期・非同期のメリット・デメリットを確認したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問