iOS 杂病论 2 - HTTP? HTTPS!

iOS 9 中一个很重要的改变,就是和 HTTP 说再见


iOS 杂病论的想法来自于《伤寒杂病论》,意在记录那些我学习和开发 iOS 遇到的奇奇怪怪的问题,并给出对应的解决方法。需要注意的是,因为开发环境以及语言版本可能存在的差异性,没有办法保证药到病除,仅供参考。

我当前的开发环境

  • Xcode 7.2
  • OS X 10.11.2
  • Swift 2.1
  • iOS 9.2 (iPhone 6s, iPod Touch 6th, iPad 3)

问题描述

在使用 NSURL 作为图片地址想把图片载入到 imageView 中时,发现出现如下错误

Transport security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app’s Info.plist file.

网上常见解决办法

这个错误的主要原因是在 iOS 9 中默认是禁用 HTTP 连接,要求使用 HTTPS 连接。

根据错误提示中的提示,我们可以在 Info.plist 中进行对应的修改,把在 NSAppTransportSecurity 字典中的 NSAllowsArbitraryLoads Key 的值设置成 YES,如下图所示

当然还有另外一种,不过也是修改 Info.plist,这个方法主要是指定可信任的网址

<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>yourserver.com</key>
<dict>
<!--Include to allow subdomains-->
<key>NSIncludesSubdomains</key>
<true/>
<!--Include to allow HTTP requests-->
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<!--Include to specify minimum TLS version-->
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
</dict>
</dict>
</dict>

或者懒一点就

<key>NSAppTransportSecurity</key>
<dict>
<!--Include to allow all connections (DANGER)-->
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

杂病药方

上面提到的两种方式都可以解决这个升级 iOS 9 之后带来的问题。不过透过现象看本质,为什么苹果要强制使用 HTTPS 连接呢?除了商业化的考虑,例如一大票基于 HTTP 的免费(当然也可能不太安全)的 API 就不能用了(如果不修改默认设置的话)

不过苹果也没有堵死所有的路,至少看起来更安全了一些,无论是默认设置,还是『白名单』机制,都可以说在一定程度上做到了放君子(能不能防小人就不知道了),或者至少在我们自己搭建服务器的时候,会更倾向于采用标准的基于 TLS 的 HTTPS 传输。

不过对于开发阶段,我觉得直接允许 HTTP 传输就好,不然测试环境经常变,改来改去也是挺麻烦的。

捧个钱场?