Подтвердить что ты не робот

IOS9 не загружает небезопасные ресурсы с защищенной страницы (SSL/HTTPS)

Я пытаюсь загрузить страницу в UIWebView на iOS9 с помощью https://URL. Загруженная страница включает CSS и изображения с небезопасного сервера.

например. загружена страница: https://www.example.com/, которая включает таблицу стилей http://www.example.com/style.css и изображение http://www.example.com/image.jpg

Все работает, если исходная страница загружается через небезопасное соединение (обычный http). Все работает также на iOS8 как через HTTPS, так и HTTP.

Я установил NSAppTransportSecurity в NSAllowsArbitraryLoads в файле приложения PLIST:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Хотя при загрузке страницы через HTTPS изображения загружаются в порядке, но файлы CSS - нет. Кажется, что UIWebView блокирует загрузку небезопасных ресурсов с защищенной страницы.

Есть ли какой-либо параметр UIWebView, который позволит загружать CSS через небезопасное соединение?

4b9b3361

Ответ 1

Это не связано с ATS. WebKit применяет смешанную политику содержимого, которая запрещает доступ к определенным классам "активного" контента (JS, CSS и т.д.) Из-за загрузки через небезопасное соединение, когда страница хоста обслуживается через https.

Если вы просмотрите свою страницу в Инспекторе, вы увидите, что это сообщается на панели ошибок.


Последующие действия: вы не можете отключить блокировку смешанного содержимого. Разрешение небезопасного CSS или JS снижает безопасность всей страницы до уровня наименее защищенного ресурса. Решение, если вы должны загрузить css/js через http, это загрузить всю страницу через http. Таким образом, пользовательский интерфейс, отображаемый пользователем, правильно отражает безопасность содержимого.

Ответ 2

В вашем info.plist вам нужно добавить следующие ключи безопасности для транспорта приложений:

NSAppTransportSecurity                                      Dictionary
    NSAllowsArbitraryLoads                                  Boolean       YES
    NSExceptionDomains                                      Dictionary    
        **YOUR-DOMAIN-HERE**                                Dictionary
            NSExceptionAllowsInsecureHTTPLoads              Boolean       YES
            NSIncludesSubdomains                            Boolean       YES
            NSThirdPartyExceptionAllowsInsecureHTTPLoads    Boolean       YES

Надеюсь, это сработает для вас.

Ответ 3

Безопасность приложений > , измененная в версии iOS9. Теперь ваше приложение защищено от безопасного подключения. И iOS вынуждает к безопасному подключению. Это может быть конфликтом в вашем случае.

От Документация Apple

Если вашему приложению необходимо сделать запрос на небезопасный домен, вы должны указать этот домен в своем файле Info.plist приложения.

Поэтому я думаю, что это может привести к ошибке при загрузке файла .css для веб-страниц.

Итак, попробуйте указать свой домен в info.plist и проверьте, загружены ли файлы .css.

Edit:


Прожектор: вам нужно добавить еще несколько клавиш в info.plist.

Посмотрите на этот ключ NSThirdPartyExceptionAllowsInsecureHTTPLoads, это позволяет домену службы, которая не контролируется разработчиком и добавляет исключение в транспортный уровень, чтобы передать незащищенные ресурсы.

Ниже приведена структура добавления ключей для Безопасность на транспорте приложений:

введите описание изображения здесь

Для получения дополнительной информации и объяснения обо всех ключах отметьте это примечание - Технология безопасности при транспортировке приложений

Ответ 4

В Xcode 8.3.3 (8E3004b)

Он изменился на

App Transport Security Settings > Allow Arbitrary Loads in Web Content > YES

введите описание изображения здесь

Ответ 5

Ниже процедура позволяет мне открыть незащищенный контент в WKWebView.

  1. Сначала я добавил " Разрешить произвольную загрузку" в веб-контенте = YES и " Разрешить произвольную загрузку = YES" в словаре настроек безопасности транспорта приложения в info.plist. enter image description here
  2. Я добавил ниже метод делегата wkwebview:

    func webView (_ webView: WKWebView, didReceive Challenge: URLAuthenticationChallenge, завершениеHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) → Void) {завершениеHandler (.useCredential, URLCredential (trust: challenge.ser}))

    Для второго шага не забудьте зарегистрировать делегата как:

    переопределить func viewDidLoad() {super.viewDidLoad() self.webView.navigationDelegate = self}

Ответ 6

Я использую инструмент webkit, но я не могу открыть ссылку, которая не разрешает ssl (некоторые https-ссылки), и она работает с swift4 этим кодом (вы должны объявить делегат раньше)

override func viewDidLoad() {
    super.viewDidLoad()

    let url = URL(string: currentAttach.fileUrl!)
    let req = URLRequest(url:url!)
    self.webView!.load(req)
    self.webView.navigationDelegate = self

    }
}

extension ViewController: WKNavigationDelegate{

    //MARK:- WKNavigationDelegate
    //For Allow SSL https
    func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
        completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
    }

    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
        print(error.localizedDescription)
    }

    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
        print("Strat to load")
        startLoading()
    }

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        print("finish to load")
        stopLoading()
    }

}