2016-03-05 11 views
13

Mam aplikację hybrydową iOS, skupioną wokół WKWebView, ładując lokalne zasoby internetowe za pomocą loadFileURL. Interfejs WKWebView komunikuje się za pośrednictwem protokołu HTTPS z interfejsem API backendu z jQuery.ajax. Ta aplikacja działa tylko na urządzeniach mobilnych i chcę, aby interfejs API był również "tylko mobilny". To znaczy, chcę zablokować przeglądarki, takie jak Chrome i Firefox, za pomocą interfejsu API.Zmień pochodzenie WKWebView w aplikacji iOS

Moja strategia jest ustawienie nagłówka Access-Control-Allow-Origin na odpowiedziach API następująco:

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

mogę zmienić pochodzenie WKWebView do app://myApp aby uniknąć przeglądarek z zapytań API?

Odpowiedz

4

Case: 1

można wstrzyknąć JS do WKWebview w momencie tworzenia dokumentu lub dokumentów zakończeniu załadunku i spinanie skryptu java XMLHttpRequest otwartą metodę z realizacji niestandardowych, aby dodać niestandardowy nagłówek dla wszystkich AJAX żądania od WKWebView.

przykład kodu

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; 

A w XMLHTTPRequestHook.js próbują zaczepić XMLHttpRequest z niestandardowego wdrożenia, aby dodać ten niestandardowy nagłówek i oddzwonić oryginalną metodę otwartej.

Przypadek 2 Jeśli chcesz tego nagłówka do dodania podczas ładowania URLRequest w WKWebview, można dodać ten nagłówek do NSMutableRequest jak poniżej i załadować ten wniosek w WKWebview. Jednak dzięki tej metodzie możesz nie mieć tego nagłówka we wszystkich wywołaniach AJAX z WKWebview.

przykładowy kod:

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]; 

Nadzieja to pomaga.

+0

Cześć Chandra. Po stronie aplikacji chcę zmienić "pochodzenie". Nagłówek 'Access-Control-Allow-Origin' jest dodawany przez odpowiedzi serwera API! – Randomblue

+0

Witam ..Jeśli szukasz czegoś takiego jak NSURLProtocol, aby przechwycić żądanie sieciowe z WKWebview, NSURLProtocol nie działa z WKWebview, ponieważ WKWebview ładuje wszystkie żądania sieciowe z innego procesu. Jednak nadal spróbuj rozwiązać powyższe rozwiązanie w case1, aby zmienić nagłówki na wymagane wartości dla wszystkich wywołań AJAX z WKWebview i zobaczyć, czy ta pomoc. – Chandra

+0

Możesz również zmienić swoją strategię i dodać niestandardowy nagłówek (zamiast używać nagłówka Access-Control-Allow-Origin) dla wszystkich wywołań AJAX z WKWebView, a na swoim serwerze API możesz użyć tego niestandardowego nagłówka, aby zidentyfikować połączenia api pochodzą z Twojej aplikacji, a nie z innych przeglądarek. Daj mi znać, jeśli to pomoże. – Chandra

Powiązane problemy