WKWebView http -> Перенаправление https для iOS 10 Соответствие ATS
iOS 10 навязал нам https и полностью сломал приложение, которое я разрабатываю. Приложение частично для чтения RSS. URL-адреса, которые мы получаем из RSS-каналов, часто являются URL-адресами HTTP как для сайтов, так и для изображений метаданных. Эти http-URL-адреса перенаправляются в версии https, если они доступны только в safari и SFSafariViewController. Однако при использовании WKWebView такое перенаправление не происходит. ОС просто блокирует загрузку без https. Если я пытаюсь обойти проблему, поменяв местами "http" на "https" в URL, часто сайты ломаются, загружая свои изображения, CSS и JavaScript из CDN http, и эти запросы также блокируются. Как я могу получить такое же поведение в WKWebView, как в Safari? Есть ли конфигурация, которую я могу установить? Мне кажется сумасшедшим, что Apple внесла бы это изменение и просто сломала бы клиентов, используя WKWebView.
PS Facebook может как-то обойти это. Я не могу сказать, является ли это сильно взломанным SFSafariViewController или они каким-то образом заставили веб-представление работать. Кто-нибудь знает, как они этого добились?
4 ответа
Использование NSAllowsArbitraryLoads
, Ключ все еще доступен для использования; Apple просто хочет убедиться, что у вас есть веская причина для ее использования. Отображение внешнего контента внутри вашего приложения квалифицируется как таковое. Как только правила Apple ATS вступят в силу, вам нужно будет объяснить, почему они вам нужны и почему NSAllowsArbitraryLoadsInWebContent
недостаточно. Поскольку у вас уже есть ответы на эти вопросы, не должно быть проблем с тем, чтобы ваше приложение прошло процесс проверки с NSAllowsArbitraryLoads
,
Как примечание, Apple отложила требование ATS и не вступит в силу в январе 2017 года.
Покопавшись в документации Apple, я нашел новый NSAllowsArbitraryLoadsInWebContent
ключ. Это устраняет проблему для WKWebView, хотя проблематично загружать изображения через http. Я, вероятно, в конечном итоге придется прокси их через мой собственный сервер.
Хотя вы можете просто использовать NSAllowsArbitraryLoads
"Глобально отключить в сфере безопасности на транспорте, это не идеально, и Apple, скорее всего, будет отвергнут без действительно серьезного оправдания.
Лучшее решение, которое обеспечит правильное поведение как в iOS 9, так и в iOS 10, заключается в NSAllowsArbitraryLoads
а также NSAllowsArbitraryLoadsInWebContent
в вашем info.plist. Потому что iOS 9 не признает NSAllowsArbitraryLoadsInWebContent
Это будет чтить NSAllowsArbitraryLoads
, эффективно отключая в транспортной безопасности на устройствах iOS 9 для вашего приложения.
В iOS 10, если вы включите NSAllowsArbitraryLoadsInWebContent'key
iOS будет игнорировать NSAllowsArbitraryLoads
настройки, только отключение безопасности транспорта приложения только в веб-представлениях в вашем приложении. Это будет означать, что ваше приложение станет намного более безопасным в iOS 10, что, как я полагаю, повысит вероятность Apple, за исключением вашего оправдания использования исключений безопасности транспорта вашего приложения.
Изменить: мой ответ ниже неверен. Он не работает для сайтов, которые возвращают XSL, например, RSS-каналы, размещенные на feedburner. Мне не удалось найти решение для этого, поэтому, к сожалению, я возвращаюсь к разрешению произвольной загрузки.
Наше приложение также имеет общую функцию чтения RSS. Мы хотим использовать ATS для лучшей безопасности и соответствия Apple. Кроме того, многие корпоративные клиенты считают его отключение высоким риском. Таким образом, включение "Разрешить произвольные загрузки" для нас недопустимо.
На данный момент мы сделали лучшее из этого, сделав две вещи:
1. Включение Allow Arbitrary Loads in Web Content
, У нас также есть общий веб-просмотр, который отображает содержимое клиента. 2. Использование невидимого WKWebView
загрузить канал RSS, затем извлечь HTML-код с веб-страницы и проанализировать XML. Я создал суть для этого здесь
Каким-то образом, этот ужасный хак, кажется, подходит нашим целям, на данный момент.
Было бы здорово иметь решение, позволяющее переопределить безопасность транспорта на уровне сеанса URL.