2015-03-29 11 views
18

Moja aplikacja IOS zawiera kilka UIWebView. Od czasu do czasu użytkownik może zmienić witrynę mobilną w witrynę komputerową pod dowolnym adresem URL. Używam spoofing to zrobić poprzez zmianę UserAgent:Nie można zmienić UserAgent w UIWebview po załadowaniu strony

+ (void) startSpoofingUserAgent 
{ 
    [[NSUserDefaults standardUserDefaults] registerDefaults:@{ @"UserAgent" : @"Desktop" }]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

Mam też metodę, która zabija spoofing:

+ (void)stopSpoofingUserAgent 
{ 
     NSDictionary *registeredDefaults = [[NSUserDefaults standardUserDefaults] volatileDomainForName:NSRegistrationDomain]; 
     if ([registeredDefaults objectForKey:@"UserAgent"] != nil) 
     { 
      NSMutableDictionary *mutableCopy = [NSMutableDictionary dictionaryWithDictionary:registeredDefaults]; 
      [mutableCopy removeObjectForKey:@"UserAgent"]; 
      [[NSUserDefaults standardUserDefaults] setVolatileDomain:mutableCopy forName:NSRegistrationDomain]; 
      [[NSUserDefaults standardUserDefaults] synchronize]; 
     } 
} 

Potem daje użytkownikowi możliwość zmiany z pulpitu do -mobile i mobile-to-desktop za pomocą przycisku. I następnie przeładować URL z tym kodem:

 self.webView.delegate = self; 
     self.webView.scalesPageToFit = YES; 
     self.webView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

     //Create a URL object. 
     NSURL *url = [NSURL URLWithString:self.convertedURL]; 

     //URL Request Object 
     if(self.defaultToDesktopSite) 
     { 
      [MINNetworkingUtils startSpoofingUserAgent]; 
     } 
     else 
     { 
      [MINNetworkingUtils stopSpoofingUserAgent]; 
     } 

     NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; 

     //Load the request in the UIWebView. 
     [self.webView loadRequest:requestObj]; 

ja też bufor obecny stan użytkownik ma UIWebView w tak, że zachowuje ustawienie całej instancji. Przy pierwszym uruchomieniu aplikacji działa ona doskonale niezależnie od tego, w jakim znajduje się stanie (komputer stacjonarny lub komórkowy).

PROBLEM: Problem polega na tym, że nie mogę zmienić stanu i odzwierciedlić go w aplikacji PO początkowym obciążeniu.

Scenariusz 1:

  • użytkownik uruchamia aplikację
  • UIWebView ustawiony jest sfałszować UserAgent, tym samym zmuszając UIWebView do załadowania strony na pulpicie
  • działa świetnie!

Scenariusz 2:

  • użytkownik uruchamia aplikację
  • UIWebView jest ustawiony na NIE fałszywej UserAgent, tym samym pozwalając UIWebView załadować stronę mobilną, jeżeli jest ona dostępna
  • działa świetnie!

Scenariusz 3:

  • użytkownik uruchamia aplikację
  • UIWebView ustawiony jest sfałszować UserAgent
  • Site wyjdzie z miejsca stojące (zgodnie z oczekiwaniami)
  • Użytkownik zmienia stan na „Mobile "wybierając przycisk
  • Aplikacja ponownie ładuje UIWebView za pomocą powyższego kodu (który podszywa się pod UN)
  • NIE DZIAŁA
  • UIWebView ładuje się, ale to wciąż za pomocą „Desktop” witryny, a nie stronę mobilną
  • (scenariusz ten działa tak samo, jeśli odwrócone. Innymi słowy, jeśli UIWebView ma nas przywieźć jako "Mobile" za pierwszym razem. Działa, dopóki nie spróbuję go zmienić i przeładować.)

Scenariusz 4:

  • Przejdź przez te same kroki, jak scenariusz 3, ale rozładować aplikację z pamięci i ponownie załadować aplikację
  • odkąd czasopiśmie państwa, gdy aplikacja pochodzi górę, UIWebView uważa, że ​​powinien pojawić się w trybie "Mobilnym" (ponieważ użytkownik zmienił go po ostatnim uruchomieniu aplikacji).
  • TO DZIAŁA ZNOWU! UIWebView pojawia się w trybie "Mobilnym".

Wygląda na to, że UIWebView buforuje coś gdzieś i nie pozwala mi ponownie załadować UIWebView z innym spoofingiem. Jeśli aplikacja jest rozładowywana i ponownie ładowana, interfejs UIWebView działa zgodnie z oczekiwaniami.

Próbowałem następujących rzeczy zmusić UIWebView do niczego nie bufor i nie miały żadnego sukcesu:

[[NSURLCache sharedURLCache] removeAllCachedResponses]; 
... reload URL 

    self.convertedPageURL = [NSString stringWithFormat:@"%@?t=%@", self.convertedPageURL, randomString]; 
    ... reload URL 

Jak powiedziałem, nie mogę uzyskać UIWebView zmienić z pulpitu-to- Mobile lub Mobile-to-Desktop BEZ rozładowania aplikacji i jej ponownego załadowania.

POMOC !!!

EDIT

Jest to kod, który używałem, aby uzyskać aktualną wartość. Raz ja nazwał ten wiersz kodu, nie mogę już zmienić UserAgent:

  defaultUserAgentString = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"]; 
+1

Wypróbowałeś to tylko w symulatorze lub na urządzeniu? [Ten komentarz sprzed kilku lat] (http://stackoverflow.com/questions/15098321/change-user-agent-multiple-times#comment22259454_15098321) sugeruje, że może to być jedynie ograniczenie symulatora. –

+1

Witryna mogła umieścić plik cookie lub może to być buforowany problem. Może również zależeć od sposobu programowania witryny. Czy testujesz w różnych witrynach i uzyskujesz te same wyniki? – MwcsMac

+0

Mogę potwierdzić, że ten problem istnieje, a moja jedyna odpowiedź brzmi: "Złóż radar". –

Odpowiedz

5

UserAgent user-domyślnie klucz prywatny API. Nie ma więc zagwarantowanego zachowania. Wszystkie odpowiedzi będą empiryczne.

Mimo że brzmi to jak prawidłowe rozwiązanie, zabij i odtwórz swoją UIWebView po każdej zmianie. UIView nie odpowiada NSCopying więc będziesz musiał zrobić coś takiego jak podręcznik:

UIWebView *newWebView = [[UIWebView alloc] initWithFrame:self.webView.frame]; 
newWebView.delegate = self; 
newWebView.scalesPageToFit = YES; 
// ... and the autoreseizing mask, etc — no need to do this upon every load 

[self.webView.superview insertSubview:newWebView aboveSubview:self.webView]; 
[self.webView removeFromSuperview]; 
self.webView = newWebView; 

Jeśli to nie działa, to prawdopodobnie trzeba przełączyć się udokumentowanym pomocą ustawień agenta użytkownika. Sugerowałbym implementację twojej własnej obsługi NSURLProtocol, która akceptuje żądania, których jeszcze nie widziała, modyfikuje pole nagłówka i wysyła je po raz drugi, tym razem odmawiając ich pobrania, tak aby spadły do ​​systemu. Będzie to kłopotliwe, ale pozwoli to na niezmienne i natychmiastowe zmiany tego lub innego pola nagłówka.

Zobacz przykład kifi's engineering blog.

+0

Wymiana działającego widoku internetowego. Dzięki!!! – JustLearningAgain

Powiązane problemy