Answers:
对于iOS9,Apple做出了一个重大决定,即iOS 9禁用了来自iOS应用程序的所有不安全HTTP流量,这是应用程序传输安全性(ATS)的一部分。
要简单地禁用ATS,可以通过打开Info.plist并遵循以下步骤,并添加以下几行:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
即使允许任意加载(NSAllowsArbitraryLoads = true
)是一个不错的解决方法,您也不应完全禁用ATS,而应启用要允许的HTTP连接:
<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>
iOS 9强制使用HTTPS的连接为TLS 1.2,以避免最近的漏洞。在iOS 8中,甚至还支持未加密的HTTP连接,因此TLS的较早版本也不会出现任何问题。解决方法是,可以将此代码段添加到Info.plist中:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
如果您仅针对特定域,则可以尝试将其添加到应用程序的Info.plist中:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
似乎iOS 9.0.2中断了对有效HTTPS终结点的请求。我目前的怀疑是它需要SHA-256证书,否则会因此错误而失败。
要重现,请使用野生动物园检查UIWebView,然后尝试导航到任意HTTPS端点:
location.href = "https://d37gvrvc0wt4s1.cloudfront.net/js/v1.4/rollbar.min.js"
// [Error] Failed to load resource: An SSL error has occurred and a secure connection to the server cannot be made. (rollbar.min.js, line 0)
现在尝试前往Google(因为他们当然拥有SHA-256证书):
location.href = "https://google.com"
// no problemo
为传输安全性添加一个例外(如上面@stéphane-bruckert的回答所述)可以解决此问题。我还认为完全禁用NSAppTransportSecurity
也可以,尽管我读过完全禁用可能会危害您的应用程序审查。
[编辑]我发现,简单地枚举NSExceptionDomains
dict中要连接的域即可解决此问题,即使将NSExceptionAllowsInsecureHTTPLoads
设置保留为true也是如此。:\
问题是服务器端的ssl证书。干扰或证书与服务不匹配。例如,当网站使用www.mydomain.com的ssl证书而您使用的服务在myservice.mydomain.com上运行时。那是另一台机器。
当我将HTTPS URL指定为https://www.mywebsite.com时,出现相同的错误。但是,当我将其指定为不带三个W时,它可以正常工作:https : //mywebsite.com。
Xcode项目-> goto info.plist,然后单击+按钮,然后单击添加(应用程序传输安全设置)扩展,允许任意负载设置为是。谢谢
我的问题是NSURLConnection
,iOS9中已弃用,因此我将所有API更改为NSURLSession
,从而解决了我的问题。
我在播放时遇到错误
finished with error [-1200] Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSErrorFailingURLStringKey=https://remote-abcabc-svc.an.abc.com:1935/abr/_definst_/smil:v2/video/492F2F82592F59EA74ABAA6B9D6E6F42/F6B1BD452132329FBACD32730862CAE0/091EAD80FE9BEDD52A2F33840CA3CBAC.v3.eng.smil/playlist.m3u8, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <692A1174-DA1C-4267-9560-9020A79F8458>.<1>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalDataTask <692A1174-DA1C-4267-9560-9020A79F8458>
我确保在plist文件的异常域中添加了条目,并且NSAllowsArbitraryLoads设置为true,但仍然看到错误。
然后我意识到我正在使用https而不是http播放URL。
我将视频网址设置为http并解决了问题。