Для тех из вас, кто хочет узнать больше о том, почему это происходит, помимо того, как это исправить, читайте ниже.
С появлением iOS 9 для повышения безопасности соединений между приложением и веб-сервисами безопасные соединения между приложением и его веб-сервисом должны соответствовать передовым методам . Поведение лучших практик обеспечивается App Transport Security для:
- предотвратить случайное раскрытие и
- обеспечить поведение по умолчанию, которое является безопасным.
Как объяснено в Technote App Transport Security , при связи с веб-службой App Transport Security теперь предъявляет следующие требования и поведение:
- Сервер должен поддерживать по крайней мере версию 1.2 протокола TLS.
- Соединительные шифры ограничены теми, которые обеспечивают прямую секретность (см. Список шифров ниже.)
- Сертификаты должны быть подписаны с использованием алгоритма хеширования подписи SHA256 или более лучшего, либо с ключом RSA 2048 бит или более, либо с ключом Elliptic-Curve (ECC) 256 бит или более.
- Недействительные сертификаты приводят к серьезному отказу и отсутствию соединения.
Другими словами, ваш запрос веб-службы должен: a.) Использовать HTTPS и b.) Быть зашифрован с использованием TLS v1.2 с прямой секретностью.
Однако, как упоминалось в других публикациях, вы можете переопределить это новое поведение в App Transport Security, указав незащищенный домен в Info.plist
вашем приложении.
Чтобы переопределить, вам нужно добавить NSAppTransportSecurity
> NSExceptionDomains
свойства словаря к вашему Info.plist
. Далее вы добавите домен вашего веб-сервиса в NSExceptionDomains
словарь.
Например, если я хочу обойти поведение App Transport Security для веб-службы на узле www.yourwebservicehost.com, я бы сделал следующее:
Откройте свое приложение в Xcode.
Найдите Info.plist
файл в Project Navigator, щелкните его правой кнопкой мыши и выберите пункт меню « Открыть как > Исходный код» . Файл списка свойств появится на правой панели.
Поместите следующий блок свойств в основной словарь свойств (под первым <dict>
).
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>www.example.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
Если вам нужно предоставить исключения для дополнительных доменов, вам нужно добавить еще одно свойство словаря NSExceptionDomains
.
Чтобы узнать больше о ключах, упомянутых выше, прочитайте этот уже упомянутый technote .