Swift/https: NSURLSession/NSURLConnection HTTP 加载失败

8

很不幸,今天早上我的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

我想知道如何解决这个问题。我已经在这里阅读了一些有用的答案,但仍有很多事情我不理解,如果有人能帮助/解释一下,我将非常感激。

3个回答

12
将以下内容添加到您的应用程序的 Info.plist 中。
<key>NSAppTransportSecurity</key>  
    <dict>  
    <key>NSAllowsArbitraryLoads</key>  
    <true/>  
    </dict>

它看起来非常危险。 - Leang Socheat

3
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!,但是那个数据对象是空的。在使用它们时,特别是在处理远程数据时,你真的应该先解包可选项。
然后你遇到了一个网络错误,这可能与iOS 9中添加的ATS有关。
请参见另一个答案以暂时禁用ATS。 https://dev59.com/Dl0a5IYBdhLWcg3wD1Pb#30748166 编辑:我现在看到你已经将ssl添加到本地主机,这很好。然而,这对于ATS来说还不够,因为它需要TLS 1.2而不是自签名证书。

1
我刚刚在你评论的同时编辑了答案。我认为在使用本地服务器时禁用ATS要容易得多。确保在应用程序发布时再启用它! - Simon
抱歉打扰一下,你能告诉我如何编辑plist文件吗?因为我没有看到它使用XML语法... - SagittariusA
当然可以,在xcode中右键单击您的plist文件,然后选择Open As Source Code。http://imgur.com/eq94tju - Simon
我以为我已经让它工作了,但现在我得到了这个错误:"NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)"... - SagittariusA
这是我添加的内容: - SagittariusA
显示剩余3条评论

1

这是一个很老的问题,但我想回答一下。通常当您尝试解包http对象并返回nil时,会发生这种情况。

确保您解包了您的URL并给它一个默认值。

例如:

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

希望这有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接