Изменить происхождение WKWebView в приложении iOS

У меня есть гибридное приложение для iOS, ориентированное на WKWebView загрузку локальных веб-ресурсов с помощью _ 2_. WKWebView обменивается данными по HTTPS с серверным API с jQuery.ajax. Приложение предназначено только для мобильных устройств, и я хочу, чтобы API также был доступен только для мобильных устройств. То есть я хочу запретить браузерам, таким как Chrome и Firefox, использовать API.

Моя стратегия - установить заголовок Access-Control-Allow-Origin в ответах API следующим образом:

Access-Control-Allow-Origin: app://myApp

Могу ли я изменить происхождение WKWebView на app://myApp, чтобы браузеры не запрашивали API?


person Randomblue    schedule 05.03.2016    source источник


Ответы (1)


Случай: 1

Вы можете внедрить JS в WKWebview во время создания документа или завершения загрузки документа и подключить метод открытия Java-скрипта XMLHTTPRequest к вашей пользовательской реализации, чтобы добавить этот пользовательский заголовок для всех запросов AJAX из WKWebView.

пример кода

NSString *XMLHTTPRequestHookJSPath = [[NSBundle mainBundle] pathForResource:@"XMLHTTPRequestHook.js" ofType:nil];
NSString *kXMLHTTPRequestHookJS = [NSString stringWithContentsOfFile:XMLHTTPRequestHookJSPath encoding:NSUTF8StringEncoding error:NULL];
WKUserContentController *contentController = [[WKUserContentController alloc] init];
WKUserScript *script = [[WKUserScript alloc] initWithSource:kXMLHTTPRequestHookJS injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:NO];
[contentController addUserScript:script];
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
configuration.userContentController = contentController;

self.lastUsedWebView = [[WKWebView alloc] initWithFrame:self.webContainerView.bounds configuration:configuration];
self.lastUsedWebView.navigationDelegate = self;

И в XMLHTTPRequestHook.js попытайтесь подключить XMLHttpRequest к вашей пользовательской реализации, чтобы добавить этот пользовательский заголовок и вызвать исходный открытый метод.

Случай 2. Если вы хотите, чтобы этот заголовок добавлялся при загрузке URLRequest в WKWebview, вы можете добавить этот заголовок в NSMutableRequest, как показано ниже, и загрузить этот запрос в WKWebview. Однако с этим методом у вас может не быть этого заголовка во всех вызовах AJAX из WKWebview.

пример кода:

WKWebView * webView = /*set up your webView*/
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://example.com/index.html"]];
[request addValue:@"app://myApp" forHTTPHeaderField:@"Access-Control-Allow-Origin"];

// use stringWithFormat: in the above line to inject your values programmatically
[webView loadRequest:request];

Надеюсь это поможет.

person Chandra    schedule 08.03.2016
comment
Привет, Чандра. Что касается приложения, я хочу изменить origin. Заголовок Access-Control-Allow-Origin добавляется ответами сервера API! - person Randomblue; 08.03.2016
comment
Привет .. Если вы ищете что-то вроде NSURLProtocol для перехвата сетевого запроса от WKWebview, NSURLProtocol не работает с WKWebview, поскольку WKWebview загружает все сетевые запросы из другого процесса. Однако вы все равно попробуйте решение, упомянутое выше, в case1, чтобы изменить заголовки на требуемые значения для всех вызовов AJAX из WKWebview и посмотреть, поможет ли это. - person Chandra; 08.03.2016
comment
Кроме того, вы можете изменить свою стратегию и добавить настраиваемый заголовок (вместо использования заголовка Access-Control-Allow-Origin) для всех вызовов AJAX из WKWebView, а на своем сервере API вы можете использовать этот настраиваемый заголовок, чтобы определить, что вызовы api из вашего приложения, а не из любого другого браузера. Сообщите мне, поможет ли это. - person Chandra; 08.03.2016
comment
Браузеры могут добавлять заголовки клиентов с помощью JavaScript. С точки зрения безопасности это не поможет, если вас не устраивает задержка предварительной проверки CORS OPTIONS, которую я сейчас представляю. - person Randomblue; 08.03.2016