Изменить пользовательский агент в UIWebView
У меня есть бизнес, чтобы иметь возможность настроить UserAgent для встроенного UIWebView. (Например, я хотел бы, чтобы сервер реагировал по-другому, если, скажем, пользователь использует одну версию приложения по сравнению с другой.)
Можно ли настроить UserAgent в существующем элементе управления UIWebView, как, скажем, для встроенного браузера IE в приложении Windows?
13 ответов
Современный Свифт
Вот предложение для проектов Swift 3+ от пользователей Stackru PassKit и Kheldar:
UserDefaults.standard.register(defaults: ["UserAgent" : "Custom Agent"])
Источник: /questions/34096957/izmenit-polzovatelskij-agent-v-uiwebview/34096963#34096963
Ранее Objective-C Ответ
С изменениями iOS 5, я рекомендую следующий подход, первоначально из этого вопроса Stackru: UIWebView iOS5 смена пользовательского агента, как указано в ответе ниже. В комментариях на этой странице, кажется, работает в 4.3 и ранее также.
Измените значение по умолчанию "UserAgent", запустив этот код один раз при запуске приложения:
NSDictionary *dictionary = @{@"UserAgent": @"Your user agent"}; [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary]; [[NSUserDefaults standardUserDefaults] synchronize];
Смотрите предыдущие изменения в этом посте, если вам нужны методы, которые работают в версиях iOS до 4.3/5.0. Обратите внимание, что из-за обширных правок следующие комментарии / другие ответы на этой странице могут не иметь смысла. В конце концов, это четырехлетний вопрос.;-)
У меня тоже была эта проблема, и перепробовал все методы. Я обнаружил, что работает только этот метод (iOS 5.x): UIWebView iOS5 меняет user-agent
Принцип заключается в постоянной настройке пользовательского агента в пользовательских настройках. Это работает; 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 по-прежнему использует значение агента пользователя от пользователя по умолчанию, независимо от того, что вы пытаетесь установить в NSHttpRequest.
Он должен работать с 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];
Очень просто в Swift. Просто поместите следующее в ваш делегат приложения.
UserDefaults.standard.register(defaults: ["UserAgent" : "Custom Agent"])
Если вы хотите добавить к существующей строке агента, то:
let userAgent = UIWebView().stringByEvaluatingJavaScript(from: "navigator.userAgent")! + " Custom Agent"
UserDefaults.standard.register(defaults: ["UserAgent" : userAgent])
Примечание: вам может понадобиться удалить и переустановить приложение, чтобы избежать добавления к существующей строке агента.
Фактически добавление любого поля заголовка к аргументу 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 пользовательского агента, который, очевидно, перезаписывается Apple. Я думаю, что для переопределения вам придется самостоятельно управлять NSURLConnection.
Взяв все, вот как это было решено для меня:
- (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];
}
Спасибо всем.
Использование @"User_Agent" просто приводит к появлению пользовательского заголовка в запросе GET.
User_agent: Foobar / 1.0 \ r \ n
Пользователь-агент: Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1_2, как Mac OS X; en-us) AppleWebKit/528.18 (KHTML, как Gecko) Mobile/7D11\r\n
Вышесказанное - это то, что появляется в рассеченном HTTP-пакете, по сути, подтверждая то, что Сфьява цитирует с этого форума. Интересно отметить, что "User-Agent" превращается в "User_agent".
Объединив ответ Луи Сен-Амур и NSUserDefaults+UnRegisterDefaults
В категории из этого вопроса / ответа вы можете использовать следующие методы для запуска и остановки спуфинга пользовательского агента в любое время, когда ваше приложение работает:
#define kUserAgentKey @"UserAgent"
- (void)startSpoofingUserAgent:(NSString *)userAgent {
[[NSUserDefaults standardUserDefaults] registerDefaults:@{ kUserAgentKey : userAgent }];
}
- (void)stopSpoofingUserAgent {
[[NSUserDefaults standardUserDefaults] unregisterDefaultForKey:kUserAgentKey];
}
Это решение, похоже, рассматривается как довольно умный способ сделать это
изменения-в-Headers-для-uiwebkit-HTTP-запросов
Он использует метод Swizzling, и вы можете узнать больше об этом на странице CocoaDev
Посмотри!
Я столкнулся с тем же вопросом. Я хочу добавить некоторую информацию в 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];
Используйте его перед созданием экземпляра webview.
Единственной проблемой, которую я обнаружил, было изменение только пользовательского агента
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSDictionary *dictionary = [NSDictionary
dictionaryWithObjectsAndKeys:
@"Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
@"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
}
Apple скоро перестанет принимать приложения с UIWebView. Ниже описано, как изменить пользовательский агент в WKWebView.
let config = WKWebViewConfiguration()
config.applicationNameForUserAgent = "My iOS app"
webView = WKWebView(frame: <the frame you need>, configuration: config)
Попробуйте это в AppDelegate.m
+ (void)initialize
{
// Set user agent (the only problem is that we can’t modify the User-Agent later in the program)
// iOS 5.1
NSDictionary *dictionnary = [[NSDictionary alloc] initWithObjectsAndKeys:@”Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B176 Safari/7534.48.3”, @”UserAgent”, nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary];
}
Чтобы просто добавить пользовательский контент к текущему значению UserAgent, выполните следующие действия:
1 - Получить значение агента пользователя из нового веб-сайта
2 - Добавить пользовательский контент к нему
3 - Сохранить новое значение в словаре с ключом UserAgent
4 - Сохранить словарь в стандартном UserDefaults.
Смотрите пример ниже:
NSString *userAgentP1 = [[[UIWebView alloc] init] stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSString *userAgentP2 = @"My_custom_value";
NSString *userAgent = [NSString stringWithFormat:@"%@ %@", userAgentP1, userAgentP2];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:userAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];