Відповіді:
Що стосується iOS9, Apple прийняла радикальне рішення з iOS 9, відключивши весь незахищений трафік HTTP з iOS-додатків, як частина програми безпеки транспортного забезпечення додатків (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>
* посилання на безпеку транспорту додатків (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 certs або він не вдається з цією помилкою.
Щоб відтворити, перевірте свій 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
буде працювати, хоча я читав, що повністю відключити це може поставити під загрозу перегляд вашого додатка.
[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 встановлено на істину, і все ж я бачив помилку.
Тоді я зрозумів, що я граю URL з https, а не http.
Я встановив URL-адресу відео на http і вирішено проблему.