UIWebView iOS5 смена пользовательского агента - PullRequest
35 голосов
/ 13 декабря 2011

Как я могу изменить пользовательский агент UIWebView в iOS 5?

Что я сделал до сих пор: Используя обратный вызов делегата, перехватите NSURLRequest, создайте новый URL-запрос и установите его user-agent как все, что я хочу, затем загрузите данные и перезагрузите UIWebView с помощью «loadData: MIMEType: ....».

Проблема: Это вызывает бесконечную рекурсию, когда я загружаю данные, которые вызывают делегат обратно, а стажер вызывает делегат ....

Вот метод делегата:

- (BOOL)webView:(UIWebView *)aWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {



    dispatch_async(kBgQueue, ^{
        NSURLResponse *response = nil;
        NSMutableURLRequest *newRequest = [NSMutableURLRequest requestWithURL:[request URL]];
        NSDictionary *headers = [NSDictionary dictionaryWithObject:
                                 @"custom_test_agent" forKey:@"User-Agent"];
        [newRequest setAllHTTPHeaderFields:headers];
        [self setCurrentReqest:newRequest];
        NSData *data = [NSURLConnection sendSynchronousRequest:newRequest 
                                             returningResponse:&response 
                                                         error:nil];
        dispatch_sync(dispatch_get_main_queue(), ^{
            [webView loadData:data 
                     MIMEType:[response MIMEType] 
             textEncodingName:[response textEncodingName] 
                      baseURL:[request URL]];
        });
    });

    return YES;
}

Ответы [ 3 ]

89 голосов
/ 29 декабря 2011

Измените значение по умолчанию «UserAgent», запустив этот код один раз при запуске приложения:

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"Your user agent", @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];  

РЕДАКТИРОВАТЬ: Я использовал это с большим успехом, но хочу добавить дополнительные детали. Чтобы получить пользовательский агент, вы можете включить меню «Разработчик», настроить пользовательский агент и затем подключиться к этому сайту, чтобы распечатать его для вас: WhatsMyAgent . Точно так же вы можете подключиться к любому мобильному устройству и получить его таким же образом. Кстати, это все еще отлично работает в iOS7 +

1 голос
/ 20 мая 2015

In Swift используйте это, чтобы установить UserAgent ,

func setUserAgent(){

    var userAgent = NSDictionary(objectsAndKeys:  "YourUserAgentName","UserAgent")

    NSUserDefaults.standardUserDefaults().registerDefaults(userAgent as [NSObject : AnyObject])

}

Используйте это, чтобы проверить,

println(WebView.stringByEvaluatingJavaScriptFromString("navigator.userAgent"));
0 голосов
/ 27 февраля 2012

При отправке сообщения [aWebView loadData:MIMEType:textEncodingName:baseURL:]

тогда aWebView shouldStartLoadWithRequest: будет вызван снова, а затем снова - вот почему вы получаете бесконечную рекурсию

Вы должны ограничить вызов вашего блока dispatch_async(), например, используя некоторый обычный URL:

- (BOOL)webView:(UIWebView *)aWebView shouldStartLoadWithRequest:(NSURLRequest *)request 
        navigationType:(UIWebViewNavigationType)navigationType {


    if ([[[request URL] absoluteString] isEqualToString:@"http://yourdomain.com/?local=true"]) {
        return YES;
    }


    ...

    dispatch_async(...
            [aWebView loadData:data 
                      MIMEType:[response MIMEType] 
              textEncodingName:[response textEncodingName] 
                       baseURL:[NSURL URLWithString:@"http://yourdomain.com/?local=true"]];

    );
    return NO;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...