Изменить пользовательский агент в UIWebView - PullRequest
67 голосов
/ 26 января 2009

У меня есть бизнес, чтобы иметь возможность настроить UserAgent для встроенного UIWebView. (Например, я бы хотел, чтобы сервер реагировал по-другому, если, скажем, пользователь использует одну версию приложения по сравнению с другой.)

Можно ли настроить UserAgent в существующем элементе управления UIWebView, как, скажем, для встроенного браузера IE в приложении Windows?

Ответы [ 13 ]

92 голосов
/ 02 сентября 2009

Модерн Свифт

Вот предложение для проектов Swift 3+ от пользователей StackOverflow PassKit и Kheldar:

UserDefaults.standard.register(defaults: ["UserAgent" : "Custom Agent"])

Источник: https://stackoverflow.com/a/27330998/128579

Ранее Objective-C Ответ

С изменениями в iOS 5 я рекомендую следующий подход, первоначально взятый из этого вопроса StackOverflow: UIWebView iOS5 изменяет пользовательский агент , как указано в ответе ниже. В комментариях на этой странице он работает также в 4.3 и более ранних версиях.

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

NSDictionary *dictionary = @{@"UserAgent": @"Your user agent"};
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
[[NSUserDefaults standardUserDefaults] synchronize];

См. Предыдущие правки в этом посте, если вам нужны методы, которые работают в версиях iOS до 4.3 / 5.0. Обратите внимание, что из-за обширных правок следующие комментарии / другие ответы на этой странице могут не иметь смысла. В конце концов, это четырехлетний вопрос. ; -)

19 голосов
/ 19 июня 2012

У меня тоже была эта проблема, и перепробовал все методы. Я обнаружил, что работает только этот метод (iOS 5.x): UIWebView iOS5, изменяющий пользовательский агент

Принцип заключается в постоянной настройке пользовательского агента в пользовательских настройках. Это работает; Webview отправляет указанный заголовок. Всего две строки кода:

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"Mozilla/Whatever version 913.6.beta", @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];

Установка User-Agent или User_Agent в изменяемом запросе или переопределение setValue в NSHttpRequest с помощью swizzling, - я пробовал все это и контролировал результаты с помощью wireshark, и, похоже, ничего из этого не работает, потому что Webview по-прежнему использует Значение user agent из значения пользователя по умолчанию, независимо от того, что вы пытаетесь установить в NSHttpRequest.

18 голосов
/ 18 февраля 2009

Он должен работать с NSMutableURLRequest, как написал Кусо.

NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: @"http://www.google.com/"]];
[urlRequest setValue: @"iPhone" forHTTPHeaderField: @"User-Agent"]; // Or any other User-Agent value.

Вы должны будете использовать NSURLConnection, чтобы получить responseData. Установите responseData для вашего UIWebView, и webView должен отобразить:

[webView loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)encodingName baseURL:(NSURL *)baseURL];
10 голосов
/ 06 декабря 2014

Очень просто в Swift. Просто поместите следующее в ваш делегат приложения.

UserDefaults.standard.register(defaults: ["UserAgent" : "Custom Agent"])

Если вы хотите добавить к существующей строке агента, то:

let userAgent = UIWebView().stringByEvaluatingJavaScript(from: "navigator.userAgent")! + " Custom Agent"
UserDefaults.standard.register(defaults: ["UserAgent" : userAgent])

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

6 голосов
/ 21 сентября 2010

Фактически добавление любого поля заголовка к аргументу NSURLRequest в shouldStartLoadWithRequest кажется работающим, потому что запрос отвечает на setValue: ForHTTPHeaderField - но на самом деле не работает - запрос рассылается без заголовка.

Так что я использовал этот обходной путь в shouldStartLoadWithRequest, который просто копирует данный запрос в новый изменяемый запрос и перезагружает его. Фактически это изменяет отправляемый заголовок.

if ( [request valueForHTTPHeaderField:@"MyUserAgent"] == nil )
{
    NSMutableURLRequest *modRequest = [request mutableCopyWithZone:NULL];
    [modRequest setValue:@"myagent" forHTTPHeaderField:@"MyUserAgent"];
    [webViewArgument loadRequest:modRequest];
    return NO;
}

К сожалению, это по-прежнему не позволяет переопределить HTTP-заголовок user-agent, который, очевидно, перезаписывается Apple. Я думаю, что для переопределения вам придется самостоятельно управлять NSURLConnection.

6 голосов
/ 12 января 2010

Использование @ "User_Agent" просто приводит к появлению пользовательского заголовка в запросе GET.

User_agent: Foobar / 1.0 \ r \ n
User-Agent: Mozilla / 5.0 (iPhone; U; ЦП iPhone OS 3_1_2, как Mac OS X; ru) AppleWebKit / 528.18 (KHTML, например Геккон) Мобильный / 7D11 \ r \ n

Вышесказанное - это то, что появляется в рассеченном HTTP-пакете, в сущности, подтверждая то, что Сфьява цитировал с этого форума. Интересно отметить, что «User-Agent» превращается в «User_agent».

6 голосов
/ 06 января 2010

Взяв все, вот как это было решено для меня:

- (void)viewDidLoad {
    NSURL *url = [NSURL URLWithString: @"http://www.amazon.com"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setValue:@"Foobar/1.0" forHTTPHeaderField:@"User-Agent"];
    [webView loadRequest:request];
}

Спасибо всем.

5 голосов
/ 07 августа 2013

Объединяя ответ Луи Сен-Амура и NSUserDefaults+UnRegisterDefaults категорию из этого вопроса / ответа , вы можете использовать следующие методы для запуска и остановки подмены пользовательского агента в любое время, пока ваше приложение работает:

#define kUserAgentKey @"UserAgent"

- (void)startSpoofingUserAgent:(NSString *)userAgent {
    [[NSUserDefaults standardUserDefaults] registerDefaults:@{ kUserAgentKey : userAgent }];
}

- (void)stopSpoofingUserAgent {
    [[NSUserDefaults standardUserDefaults] unregisterDefaultForKey:kUserAgentKey];
}
4 голосов
/ 05 августа 2010

Похоже, это решение представляется довольно умным способом сделать это

изменение-на-Headers-для-uiwebkit-HTTP-запросов

Он использует метод Swizzling, и вы можете узнать больше об этом на странице CocoaDev

Посмотри!

2 голосов
/ 14 мая 2014

Я столкнулся с тем же вопросом. Я хочу добавить некоторую информацию в user-agent, также необходимо сохранить оригинальный user-agent webview. Я решил это с помощью кода ниже:

    //get the original user-agent of webview
UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero];
NSString *oldAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSLog(@"old agent :%@", oldAgent);

//add my info to the new agent
NSString *newAgent = [oldAgent stringByAppendingString:@" Jiecao/2.4.7 ch_appstore"];
NSLog(@"new agent :%@", newAgent);

//regist the new agent
NSDictionary *dictionnary = [[NSDictionary alloc] initWithObjectsAndKeys:newAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary];

Используйте его перед созданием веб-браузера.

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