Как я могу создать веб-браузер iOS, который проксирует весь трафик через прокси-сервер?

Я хочу создать приложение для iOS, которое реализует стандартный веб-браузер, похожий на Safari, который проксирует весь свой трафик через прокси-сервер. В частности, он должен использовать собственную конфигурацию прокси-сервера, чтобы только его трафик направлялся через прокси-сервер, а не через системные настройки iOS.

У меня есть некоторая гибкость в выборе используемого прокси. Я бы предпочел прокси Socks5, но прокси HTTP/HTTPS тоже подойдет. В любом случае он должен поддерживать аутентификацию.

Я бы предпочел использовать SFSafariViewController, так как мне хотелось бы, чтобы этот веб-браузер был как можно ближе к использованию Safari, но я понимаю, что SFSafariViewController ограничено и может быть невозможно. Если это не удастся, я надеюсь использовать WKWebView, но если и это невозможно, я могу с неохотой вернуться к UIWebView.

Как бы это сделать?

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


person GuyGizmo    schedule 29.03.2017    source источник


Ответы (1)


Вы можете внедрить локальный веб-сервер, размещенный на localhost:<some_weird_port_number>, и заставить свой WKWebView загружать только локальные адреса с этого сервера. Ваш сервер загрузит то, что вы хотите и как вы хотите, а затем выдаст это в качестве ответа на веб-представление.

person Eugene Dudnyk    schedule 29.03.2017
comment
Я не совсем понимаю, как я мог бы использовать это для нормального просмотра веб-страниц. После того, как страница загружена, а затем предоставлена ​​локальным веб-сервером, любые ссылки на ресурсы страницы или на другие страницы не будут использовать адрес локального хоста. - person GuyGizmo; 29.03.2017
comment
Да, вам придется сканировать содержимое веб-страницы и заменять там URL-ссылки. Другой подход может заключаться в том, что вы будете использовать UIWebView и пользовательский NSURLProtocol, чтобы полностью переопределить сетевое подключение. - person Eugene Dudnyk; 29.03.2017
comment
Я действительно хочу избежать сканирования веб-страниц, особенно потому, что это означало бы, что мне также пришлось бы заменять URL-ссылки в сценариях, что является рискованной и, вероятно, невыполнимой задачей. Спасибо за совет по NSURLProtocol и UIWebView. Я изучал это. К сожалению, UIWebView означает использование менее производительного движка javascript и необходимость заново изобретать колесо с точки зрения пользовательского интерфейса, чтобы обеспечить работу, подобную Safari. - person GuyGizmo; 29.03.2017
comment
Да, к сожалению, WKWebView (который также используется в SFSafariViewController) запускает веб-соединение в отдельном процессе, и нет возможности что-либо переопределить. - person Eugene Dudnyk; 29.03.2017
comment
Я подумывал попробовать метод swizzling, так что спасибо, что заранее сообщили мне, что это не сработает! - person GuyGizmo; 29.03.2017
comment
Однако Swizzling может работать с WKWebView, в зависимости от того, что вы хотите swizzling. Например, мне удалось просмотреть содержимое WKWebView и разобраться с его ошибочным распознаванием жестов. WebKit2 и WKWebView имеют открытый исходный код, вы можете проверить код и найти там то, что вы хотите использовать. Надеюсь, ваше приложение не для магазина приложений :) - person Eugene Dudnyk; 29.03.2017
comment
Нет, не для магазина приложений! Я думал о том, чтобы прокрутить что-то, что дает мне доступ к NSURLSession или NSURLSessionConfiguration, а затем переопределить его поведение, чтобы он всегда использовал прокси, но это, вероятно, происходит в другом процессе, и поэтому я не могу прокрутить. Но я не знал, что WKWebView имеет открытый исходный код, поэтому я могу повозиться с ним и посмотреть, чем я могу управлять. - person GuyGizmo; 29.03.2017