Swift 2: NSData (contentsOfURL: url), возвращающий ноль

У меня есть адрес веб-страницы, содержащий файл JSON. Я пытаюсь получить доступ к файлу JSON как NSDictionary в Swift 2. Каждый раз, когда я вызываю NSData(contentsOfURL:url!), где url является типом 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..........>)

Когда я пытаюсь в Терминале, это определенно сработало. Может ли кто-нибудь помочь мне решить проблему?

Ответ 1

Я ожидаю, что он будет работать в терминале, так как то, что вы видите здесь, скорее всего, не является ошибкой в ​​Swift или Cocoa Touch, но побочные эффекты новой функции в iOS 9 называются Безопасность транспорта приложений. Это означает, что по умолчанию iOS не позволит вам создавать серверы запросов, не защищенные SSL.

Цитата из ссылки:

App Transport Security (ATS) позволяет приложению добавлять объявление в свой файл Info.plist, который указывает домены, которым необходима безопасная связь. ATS предотвращает случайное раскрытие информации, обеспечивает безопасное поведение по умолчанию и легко адаптируется. Вы должны принять ATS как можно скорее, независимо от того, создаете ли вы новое приложение или обновляете существующий.

Если вы разрабатываете новое приложение, вы должны использовать исключительно HTTPS. Если у вас есть существующее приложение, вы должны использовать HTTPS столько, сколько вы можете прямо сейчас, и создать план для переноса остальной части вашего приложения как можно скорее.

Чтобы исправить это, вы можете отредактировать свой файл info.plist, чтобы делать исключения в домене по базе данных, или полностью отключить защиту транспорта приложений. Вот пример, приведенный из CFNetwork SSLHandshake, завершился неудачей 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>

Хотя я советую вам не использовать это как ваше решение и вместо этого вместо этого использовать защищенный https-адрес SSL.