10

JSON ファイルを含む Web ページのアドレスがあります。NSData(contentsOfURL:url!)Swift 2 で NSDictionary として JSON ファイルにアクセスしようとしています。 where urlis type ofを呼び出すたび にNSURL?、 が返されますnil。私は Xcode 7 Beta を使用しており、プロジェクトは最初に Xcode 6 で作成されました。

次のコードが問題を引き起こしています。

let url = NSURL(string:myurl) // myurl is the webpage address.
let data = NSData(contentsOfURL:url!) // the bit that returns nil
// data is set to nil
// I would perform NSJSONSerialization.JSONObjectWithData later.

私を混乱させているのは、を使用してターミナルで同じコードを入力したときにまったく同じことを試みるとswift、定数dataが nil に設定されないことです。Mac を再起動しようとしましたが、うまくいきませんでした。Xcodeを再インストールしようとしましたが、うまくいきませんでした。

swiftこれは、キーワードを使用してターミナルに次のコードを入力するとどうなるかです。

$> swift
......
Welcome to Apple Swift version 2.0 (700.0.38.1 700.0.53). Type :help for assistance. 

1> import Foundation
2> var urlstr = "http://mywebsiteaddress/jsonfile.json"
3> var nsurl = NSURL(string:urlstr)
nsurl: NSURL? = "http://mywebsiteaddress/jsonfile.json"{
    ObjectiveC.NSObject = {...}
}
4> var nsdata = NSData(contentsOfURL:nsurl!)
nsdata: NSData? = 5925 bytes {
    ObjectiveC.NSObject = {...}
}
5> print(nsdata)
Optional(<Some Values..........>)

ターミナルで試してみると、間違いなく機能しました。誰でも私が問題を解決するのを手伝ってもらえますか??

4

1 に答える 1

13

ここに表示されているのは Swift や Cocoa Touch のバグではなく、 App Transport Securityと呼ばれる iOS 9 の新機能の副作用である可能性が高いため、ターミナルで動作することを期待しています。これが意味することは、デフォルトでは、iOS は SSL で保護されていないサーバーへのリクエストを許可しないということです。

リンクから引用:

アプリ トランスポート セキュリティ (ATS) を使用すると、アプリは Info.plist ファイルに、セキュリティで保護された通信が必要なドメインを指定する宣言を追加できます。ATS は、偶発的な開示を防ぎ、安全な既定の動作を提供し、簡単に採用できます。新しいアプリを作成しているか、既存のアプリを更新しているかに関係なく、できるだけ早く ATS を採用する必要があります。

新しいアプリを開発している場合は、HTTPS のみを使用する必要があります。既存のアプリがある場合は、今すぐできる限り HTTPS を使用し、残りのアプリをできるだけ早く移行するための計画を作成する必要があります。

これを修正するには、info.plist ファイルを編集してドメインごとに例外を作成するか、App Transport Security を完全に無効にします。CFNetwork SSLHandshake failed iOS 9 Beta 1から引用した例を次に示します。

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow insecure HTTP requests-->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

ただし、実際にはこれをソリューションとして使用せず、代わりに SSL で保護された https URL を使用することをお勧めします。

于 2015-06-15T16:28:04.610 に答える