2016-03-05 3 views
13

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

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

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

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

ответ

4

Корпус: 1

Вы можете придать JS в WKWebview в момент создания документа или документа закончена загрузка и зацепить Java Script 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]; 

Надеется, что это помогает.

+0

Hi Chandra. На стороне приложения я ищу, чтобы изменить «происхождение». Заголовок 'Access-Control-Allow-Origin' добавляется ответами сервера API! – Randomblue

+0

Привет. Если вы ищете что-то вроде NSURLProtocol для перехвата сетевого запроса из WKWebview, NSURLProtocol не работает с WKWebview, поскольку WKWebview загружает все сетевые запросы из другого процесса. Однако вы по-прежнему пытаетесь решить упомянутое выше решение в case1, чтобы изменить заголовки на требуемые значения для всех вызовов AJAX из WKWebview и посмотреть, поможет ли эта помощь. – Chandra

+0

Также вы можете изменить свою стратегию и добавить собственный заголовок (вместо заголовка Access-Control-Allow-Origin) для всех вызовов AJAX из WKWebView и на вашем сервере API вы можете использовать этот настраиваемый заголовок, чтобы определить, что вызовы api из вашего приложения, а не из любого другого браузера. Сообщите мне, если это поможет. – Chandra

Смежные вопросы