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

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

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

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

Q&A

解決済

1回答

2083閲覧

JSONSerialization.jsonObject(with: data!, ←「with: data!」とは何でしょうか。

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

0クリップ

投稿2016/12/22 05:25

編集2016/12/22 07:37

前提
swiftとphpでログイン機能を作っています。
MAMPのmysqlを使用しています。
ビルドは成功するのですが、ユーザー登録ができません。
JSONSerializationの使い方がわかりませんので、教えてください。

問題点
下記コードにて、ステップインすると、catchへいってしまいます。
デバッグで確認したところ、with: data!はnilになっていました。
nilが原因なのかなと思うのですが。。。

swift

1do{ 2let json = try JSONSerialization.jsonObject(with: data!,options: .mutableContainers) as? NSDictionary 3 4}catch{ 5 6}

こちらが全文です。

swift

1// Send HTTP POST 2 let myUrl = NSURL(string: "http://localhost/registerUser.php"); 3 let request = NSMutableURLRequest(url:myUrl! as URL); 4 request.httpMethod = "POST"; 5 6 let postString = "userEmail=\(userEmail)&userPassword=\(userPassword)&userFirstName=\(userFirstName)&userLastName=\(userLastName)"; 7 8 request.httpBody = postString.data(using: String.Encoding.utf8); 9 10 URLSession.shared.dataTask(with: request as URLRequest, completionHandler:{(data:Data?, response:URLResponse?, error:Error?) -> Void in 11 12 DispatchQueue.main.async { 13 if error != nil{ 14 self.displayAlertMessage(userMessage: (error?.localizedDescription)!) 15 return 16 } 17 18 do{ 19 20 let json = try JSONSerialization.jsonObject(with: data!,options: .mutableContainers) as? NSDictionary 21 if let parseJSON = json { 22 23 let userId = parseJSON["userId"] as? String 24 25 if( userId != nil){ 26 let myAlert = UIAlertController(title: "Alert", 27 message: "Registration successful", preferredStyle: UIAlertControllerStyle.alert); 28 let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default){ 29 (action) in self.dismiss(animated: true, completion:nil) 30 } 31 myAlert.addAction(okAction); 32 self.present(myAlert, animated: true, completion: nil) 33 }else { 34 let errorMessage = parseJSON["message"] as? String 35 if(errorMessage != nil){ 36 self.displayAlertMessage(userMessage: errorMessage!) 37 } 38 } 39 } 40 41 }catch{ 42 print(error.localizedDescription) 43 } 44 45 }//dispatch.main.async 46 47 }).resume() 48 49 }

よろしくお願いします。
情報不足でしたら、教えていただけると幸いです。

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

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

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

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

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

fuzzball

2016/12/22 05:43 編集

(deleted)
guest

回答1

0

ベストアンサー

下記コードでステップインすると、catchへいってしまいます。

サイズが0なら正しい動作だと思いますが?

ATS

ATSの設定は行っているでしょうか?

iOS 9 で追加された App Transport Security の概要

投稿2016/12/22 05:42

編集2016/12/22 07:50
fuzzball

総合スコア16731

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

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

退会済みユーザー

退会済みユーザー

2016/12/22 05:50

質問が雑でした。 すみません。 すぐに修正して投稿します。 ご回答ありがとうございます。
fuzzball

2016/12/22 07:51

追記しました。
退会済みユーザー

退会済みユーザー

2016/12/22 07:54

Info.plist で App Transport Security Settings Allow Arbitrary Loads Boolean Trueにしています。 すみません、情報不足でした。
fuzzball

2016/12/22 08:00

サーバからはJSONが返ってくるのは間違いないでしょうか? リクエストしているurlをブラウザに入力すると正常に取得できてますか?
fuzzball

2016/12/22 08:02

あ、POSTってブラウザから出来ないんでしたっけ?(こういうの詳しくないので)
退会済みユーザー

退会済みユーザー

2016/12/22 08:13

リクエストしているurlをブラウザから入力して、パラメータも与えてあげると、正常にユーザー登録ができています。 サーバーからJSONが返ってきているかは、 let json = try JSONSerialization.jsonObject(with: data!,options: .mutableContainers) as? NSDictionary の後、catchにいくので正常に返ってきていないのではと思います。 ※すみません。私は、swiftを初めて1ヶ月の超初心者です。プログラミングもほぼ初めてです。
fuzzball

2016/12/22 08:17

dataがnilなのでJSONSerializationは(今のところ)関係ないです。 その前の、リクエスト&受信をおこなっているURLSession.shared.dataTask()に問題があります。
fromageblanc

2016/12/22 08:18

ブラウザのアドレス欄から投げられるならGETじゃないですか?それたぶん。
退会済みユーザー

退会済みユーザー

2016/12/22 08:48

>>fuzzballさん URLSession.shared.dataTask(with: request as URLRequest, completionHandler:{(data:Data?, response:URLResponse?, error:Error?) -> Void in の「data」及び「response」が「nil」でした。 このdataは引数でしょうか。 だとしたら、どこからもらってきているのでしょうか。 自分で書いておいてなんだそれは、という感じなんですが、、、 >>fromageblancさん getとはどこのことでしょうか。。。すみません!
退会済みユーザー

退会済みユーザー

2016/12/22 08:54

デバッグでステップインしている際の挙動なのですが、 URLSession.shared.dataTask(with: request as URLRequest, completionHandler:{(data:Data?, response:URLResponse?, error:Error?) -> Void in の後に、 }).resume() を2回ほど行ったり来たりして、そのあと それ以降の処理が走っています。 これは動きとしては、正常なのでしょうか。。。 よくわからずコードを書いているせいです。すみません。
fromageblanc

2016/12/22 08:56

request.httpMethod = "POST";のところです。GETなのじゃないかなと。
fuzzball

2016/12/22 08:59

リクエストした後、サーバからデータを受信したときにcompletionHandlerが呼ばれます。データ本体、レスポンス(ステータスコードとかヘッダ)、エラー情報です。 errorはnilじゃないのでしょうか?それならアラートが表示されてますよね?アラートがうまく表示出来ていないのであればprintで出力してエラー内容を確認して下さい。
退会済みユーザー

退会済みユーザー

2016/12/22 09:23

>>fromageblancさん GETで試しましたが、動きません。 >>fuzzballさん completionHandlerのご説明ありがとうございます。 errorにはinstance_type = 0x000061000024cdb0 -> 0x000000010508cf28 (void *)0x000000010508cf00: NSURLError) が入っているようです。
fuzzball

2016/12/22 09:28

print(error.localizedDescription) で出力してみて下さい。
退会済みユーザー

退会済みユーザー

2016/12/22 09:33

print(error.localizedDescription) をどこに書けばいいのか、よくわからなかったのですが、 The request is timed out.が出力されています。
退会済みユーザー

退会済みユーザー

2016/12/22 10:03

localhostアドレスでなく、自分のパソコンのアドレス192.168.xxx.xxxでアクセスしたところ、ユーザー登録ができました。 mysqlサーバーを見ると、Optional("登録したメールアドレス、、、、と渡すパラメータが変なせいか、変に登録されてしまっていますが。。。 fuzzballさん fromageblancさん 呆れず、とても親切に、お答えいただき本当にありがとうございます。 雑な質問ですみませんでした。 まだわからないことだらけなので、また質問させていただきます。 .resume json parse httpBody httpMethod このあたりも全くわからずに使っているので、後々怖いです。
fuzzball

2016/12/22 10:13 編集

Optional(...)は ! 付けたら直るかも。 request.httpBody = postString.data(using: String.Encoding.utf8)! 書き出した「分からないこと」は、とりあえず一回ググってみることです。 キーワード + Swift で検索すればそれなりに見つかると思います。
退会済みユーザー

退会済みユーザー

2016/12/22 10:18

ご回答ありがとうございます。 「!」つけましたが、直りませんでした。 正しくないパラメータを渡しているようで、FirstNameなどが登録できておらず、Optional(...が登録されています。 ガンバって修正します。 英語ばかりで、よくわかりませんが、もう一度読んで見ます。
fuzzball

2016/12/22 10:33

あー、postStringの中の1つ1つに付けないといけないのかな。userEmail! とか userPassword! とか。 あんまり適当にグダグダ回答するのもアレなのでこの辺で。
退会済みユーザー

退会済みユーザー

2016/12/22 10:45

おっしゃる通り let postString = "userEmail=\(userEmail!)&userFirstName=\(userFirstName!)&userLastName=\(userLastName!)&userPassword=\(userPassword!)"; で直りました。 たくさんのお時間、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問