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"];
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. –
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
Mogę potwierdzić, że ten problem istnieje, a moja jedyna odpowiedź brzmi: "Złóż radar". –