【问题标题】:Swift 2 : NSData(contentsOfURL:url) returning nilSwift 2:NSData(contentsOfURL:url) 返回 nil
【发布时间】:2015-08-31 03:15:32
【问题描述】:

我有一个包含 JSON 文件的网页地址。我试图在 Swift 2 中以 NSDictionary 的形式访问 JSON 文件。每次我调用 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..........>)

当我在终端中尝试时,它确实有效。谁能帮我解决这个问题??

【问题讨论】:

  • 如果不是从swift 运行,您是否在沙盒模式下运行?

标签: ios json xcode foundation swift2


【解决方案1】:

我希望它可以在终端中工作,因为您在这里看到的可能不是 Swift 或 Cocoa Touch 中的错误,而是 iOS 9 中名为 App Transport Security 的新功能的副作用。这意味着默认情况下,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。

【讨论】:

  • +eleventy-zillion 表示“使用 SSL 安全的 https URL”。
猜你喜欢
  • 2015-12-10
  • 2016-10-19
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
  • 2015-03-13
  • 2016-09-04
  • 2017-04-24
相关资源
最近更新 更多