Swift 2:NSData(contentsOfURL:url)返回nil

Min*_*wak 10 xcode json foundation ios swift2

我有一个包含JSON文件的网页地址.我正在尝试在Swift 2中以NSDictionary的形式访问JSON文件.每当我调用 NSData(contentsOfURL:url!)where 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.
Run Code Online (Sandbox Code Playgroud)

令我困惑的是,当我在终端使用中键入相同的代码时,当我尝试完全相同的事情时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..........>)
Run Code Online (Sandbox Code Playgroud)

当我在终端尝试它肯定有效.任何人都可以帮我解决问题吗?

Mic*_*lum 13

我希望它可以在终端中运行,因为你在这里看到的可能不是Swift或Cocoa Touch中的错误,但iOS 9中新功能的副作用称为App Transport Security.这意味着默认情况下,iOS不允许您使用SSL保护请求服务器.

从链接引用:

应用程序传输安全性(ATS)允许应用程序向其Info.plist文件添加声明,该文件指定需要与其进行安全通信的域.ATS可防止意外泄露,提供安全的默认行为,并且易于采用.无论您是创建新应用程序还是更新现有应用程序,都应尽快采用ATS.

如果您正在开发新应用,则应该专门使用HTTPS.如果您有现有应用,则应尽可能多地使用HTTPS,并创建一个计划,以便尽快迁移其余应用.

要解决此问题,您可以编辑info.plist文件以逐域进行例外,或完全禁用App Transport Security.以下是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>
Run Code Online (Sandbox Code Playgroud)

虽然我建议您实际上不使用此作为您的解决方案,而是使用SSL安全的https URL.