2017-07-25 17 views
0
let params = ["first":"string", "second":["any":""]] as [String: Any] 
let serverUrl = URL(string: "https://example.execute-api.ap-southeast-2.amazonaws.com/prod")! 
var request = URLRequest(url:serverUrl) 
request.httpMethod = "POST" 
request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 
request.setValue("secret", forHTTPHeaderField: "X-Api-Key") 
do { 
    request.httpBody = try JSONSerialization.data(withJSONObject: params, options: []) 
} catch _ as NSError { 
    return 
} 

これは、新しくiosシミュレータで行8でクラッシュしますが、再試行しても機能します。私はさまざまな仮説をテストしましたが、その理由を見つけることはできません。私がテストしてみた新しくiosシミュレータでJSONシリアル化クラッシュが発生する

  1. isValidJsonObject()
  2. 混合ネストされた辞書
  3. 空の文字列
  4. 辞書 'を<' 文字列を、任意> [文字列:任意]対

クラッシュエラーメッセージは「スレッド1:EXC_BAD_ACCESS(コード= EXC_i386_GPFLT)」です。私はスレッディングに間違いがあるかどうか確認しましたが、巨大なセントラルディスパッチが正しいデータを正しい順序で出力しているようです。

手がかりはありますか?

この問題はシミュレータにのみ限定されますか、それとも物理的なipadにも表示されますか?

編集:さらにグーグルは、空の文字列が何らかの原因でnilを返すことに問題があることを示唆しています。空の文字列を強制的にnull値にすることはできますが、上記のコードは新鮮なシミュレータでのみクラッシュしますが、後は​​問題なく動作します。

+0

あなたに渡したいものをたとえば、あなたがこれを行うことができます2番目のパラメータ? –

+0

こんにちは、私は間違いを修正するために編集し、完了のために残りのリクエストを追加しました。私のテストでは、JSONSerialization関数がクラッシュするのはparams dictであることがわかりました。 – yks

答えて

0

まあ、urlRequestをあなたのparamsでエンコードする必要があるかもしれません。まず、辞書を[String : Any]にキャストし、エンコードを編集する必要があります。あなたのリクエストがPOSTしたり、HTTPボディとヘッダで、あなたの設定を指定する必要がありPUTメソッドを持っている場合は、今すぐ

let params : [String : Any] = ["first":"string", "second":["any:""]] 
do { 
     request = try URLEncoding.default.encode(urlRequest, with: params) 
    } catch _ as NSError { 
     return 
    } 

urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") 
urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters, 
               options: [.prettyPrinted]) 
+0

こんにちは、何かに乗っているかもしれません。私は最初にこの理論をテストする変数を入れる前に空の辞書varを作成します。 – yks

+0

テストでは確定できませんが、あらかじめ空の辞書を初期化していてもクラッシュは発生します。 – yks

関連する問題