Отключить ATS для встроенного браузера в iOS 9?
iOS 9 представляет App Transport Security (ATS) для поощрения использования безопасных соединений.
Это замечательно, но что если мое приложение имеет встроенный веб-браузер, который пользователь сможет использовать для подключения к любому веб-сайту? Например, приложение Facebook позволяет историям содержать ссылки на внешние сайты. Когда пользователь нажимает на такую ссылку, а не запускает Safari, он запускает браузер в приложении.
Как я могу получить то же самое поведение, не включая глобальный флаг NSAllowArbitraryLoads?
Мне нужны все преимущества принудительного использования https, но я хочу отключить эту проверку в своем внутреннем браузере. В идеальном мире Apple позволила бы мне указать свойство в моем UIWebView, чтобы позволить ему загружать небезопасные URL-адреса, а не все или ничего. Я не могу внести белый список в каждый домен, так как не знаю, какие URL будут загружать мои пользователи. Я ищу решение, совместимое с iOS 8.
2 ответа
Вместо включения NSAllowsArbitraryLoads
Более безопасным решением является условное использование SFSafariViewController, который допускает произвольные загрузки.
Если класс существует, то представьте его, в противном случае представьте свой собственный UIViewController (который содержит UIWebView).
UIViewController *webBrowser;
if ([SFSafariViewController class] != nil) {
webBrowser = [[SFSafariViewController alloc] initWithURL:url];
} else {
webBrowser = [[ABCWebBrowserController alloc] initWithURL:url];
}
[self presentViewController:webBrowser animated:YES completion:nil];
В этом случае вам нужно будет отключить ATS вообще, установив NSAllowsArbitraryLoads
к истине. Если у вас есть определенные URL-адреса, которые, как вы знаете, могут поддерживать HTTPS (например, ваши собственные серверы или серверы API, которые вы используете в приложении за пределами UIWebView
) затем вы можете создать исключение и установить NSExceptionsAllowsInsecureHTTPLoads
ложно для этих исключений