Ответы:
Что касается iOS9, Apple приняла радикальное решение с iOS 9, отключив весь незащищенный HTTP-трафик из приложений iOS в рамках App Transport Security (ATS) .
Чтобы просто отключить ATS, вы можете выполнить следующие действия, открыв Info.plist и добавив следующие строки:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Несмотря на то, что разрешение произвольной load ( 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>
* ссылается на безопасность транспорта приложений (ATS)
Если вы просто ориентируетесь на определенные домены, вы можете попробовать добавить это в 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 с помощью safari и попробуйте перейти к произвольной конечной точке 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
тоже сработает, хотя я читал, что полное отключение может поставить под угрозу обзор вашего приложения.
[EDIT] Я обнаружил, что простое перечисление доменов, к которым я подключаюсь, в NSExceptionDomains
dict устраняет эту проблему, даже если оставить NSExceptionAllowsInsecureHTTPLoads
значение true. : \
Проблема заключается в сертификате ssl на стороне сервера. Либо что-то мешает, либо сертификат не соответствует службе. Например, когда у сайта есть сертификат ssl для www.mydomain.com, а используемая вами служба работает на myservice.mydomain.com. Это другая машина.
Я получаю ту же ошибку, когда указываю свой URL HTTPS как: https://www.mywebsite.com . Однако он отлично работает, когда я указываю его без трех W как: https://mywebsite.com .
Проект Xcode -> goto info.plist и нажмите + кнопку, затем добавьте (настройки безопасности транспорта приложения) разверните, разрешите произвольные нагрузки, установите ДА. Спасибо
Моя проблема заключалась в NSURLConnection
том, что она устарела в iOS9, поэтому я изменил весь API на, NSURLSession
и это устранило мою проблему.
В моем случае я столкнулся с этой проблемой в своем симуляторе, потому что дата моего компьютера отставала от текущей даты. Так что проверяйте и этот случай, когда сталкиваетесь с ошибкой SSL.
Я получал ошибку ниже при воспроизведении
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, но я все еще видел ошибку.
Потом я понял, что проигрываю URL с https, а не с http.
Я установил URL-адрес видео на http, и проблема решена.