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 через небезопасное соединение?
Ответы
Ответ 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.
- Сначала я добавил " Разрешить произвольную загрузку" в веб-контенте = YES и " Разрешить произвольную загрузку = YES" в словаре настроек безопасности транспорта приложения в info.plist.
![enter image description here]()
-
Я добавил ниже метод делегата 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()
}
}