【问题标题】:Swift/https: NSURLSession/NSURLConnection HTTP load failedSwift/https:NSURLSession/NSURLConnection HTTP 加载失败
【发布时间】:2015-12-18 07:50:49
【问题描述】:

不幸的是,今天早上我的 XCode 更新到了第 7 版,而我使用 http 开发的 iOS 应用程序现在需要 https。因此,按照许多教程,我配置了我的 MAMP 服务器,以便使用 https/ssl 创建一个虚拟证书。现在在我的 iOS 应用程序中,URL 如下所示:

static var webServerLoginURL = "https://localhost:443/excogitoweb/mobile/loginM.php"
static var webServerGetUserTasks = "https://localhost:443/excogitoweb/mobile/handleTasks.php"
static var webServerGetUsers = "https://localhost:443/excogitoweb/mobile/handleUsers.php"
static var webServerGetProjects = "https://localhost:443/excogitoweb/mobile/handleProjects.php"

如果我尝试在浏览器中访问它们,它们可以正常工作。 我习惯于使用 NSURLSession.sharedSession().dataTaskWithRequest() 访问数据库和 php 文件,这现在会引发标题错误。例如,这是引发错误的行:

if let responseJSON: [[String: String]] = (try? NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions())) as? [[String: String]] {
...
}

这是完整的错误信息:

2015-09-21 16:41:48.354 ExcogitoWeb[75200:476213] CFNetwork SSLHandshake failed (-9824)
2015-09-21 16:41:48.355 ExcogitoWeb[75200:476213] NSURLSession/NSURLConnection   HTTP load failed (kCFStreamErrorDomainSSL, -9824)
fatal error: unexpectedly found nil while unwrapping an Optional value

我想知道如何解决这个问题。我在这里阅读了一些有用的答案,但还有很多我不明白的地方,如果有人能帮助/解释我,我将不胜感激。

【问题讨论】:

    标签: ios https swift2 xcode7


    【解决方案1】:

    将此添加到您应用的Info.plist

    <key>NSAppTransportSecurity</key>  
        <dict>  
        <key>NSAllowsArbitraryLoads</key>  
        <true/>  
        </dict>
    

    【讨论】:

    • 看起来很危险
    【解决方案2】:
    fatal error: unexpectedly found nil while unwrapping an Optional value
    

    通常意味着你做的不太好,通过查看你的if

    if let responseJSON: [[String: String]] = (try? NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions())) as? [[String: String]] {
    

    我可以看到有一个data!,但是那个数据对象是 nil。你真的应该在使用它们之前解开它们,尤其是在处理远程数据时。

    那么你有一个网络错误,这可能与iOS 9中添加的ATSApple有关。

    查看另一个关于如何暂时禁用 ATS 的答案。 https://stackoverflow.com/a/30748166/421755

    edit:我现在看到您已将 ssl 添加到本地主机,这很好。然而,ATS 工作还不够,因为它需要 TLS 1.2 而不是自签名证书。

    【讨论】:

    • 是的,我想问题是由于网络错误导致数据为零,我会按照你说的尝试禁用它...我所理解的是我应该升级 MAMP ssl/ tls 到 1.2 ......现在有可能吗?还是等一下?
    • 我刚刚在您发表评论的同时编辑了答案。我认为在使用本地服务器时禁用ATS 会更容易。确保稍后在发布应用时启用它!
    • 我刚刚读到 TLS 1.2 将与 OSX El Capitan 一起提供......我真的希望如此。我正在为考试开发这个 iOS 应用程序,我不想在老师眼中看起来像个没有经验的人......谢谢你的帮助
    • 抱歉打扰了..你能告诉我如何编辑 plist 文件吗?因为我没有看到它与 xml syntas...
    • 当然,只需在 xcode 中右键单击您的 plist 文件,然后选择 Open As Source Codeimgur.com/eq94tju
    【解决方案3】:

    非常老的问题,但我想我会回答。这通常发生在您尝试解开一个 http 对象并且它返回 nil 时。

    确保您打开您的 url 并给它一个默认值。

    例子:

    let jsonURL = "your https link to your json"
    guard let url = URL(string: jsonURL) else { return } // dont force unwrap
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多