Изменить пользовательский агент в UIWebView
У меня есть бизнес, чтобы иметь возможность настроить UserAgent для встроенного UIWebView. (Например, я бы хотел, чтобы сервер реагировал по-другому, если, скажем, пользователь использует одну версию приложения по сравнению с другой.)
Можно ли настроить UserAgent в существующем элементе управления UIWebView, как, скажем, для встроенного браузера IE в приложении Windows?
Ответы
Ответ 1
Современный Свифт
Вот предложение для проектов Swift 3+ от пользователей StackOverflow PassKit и Kheldar:
UserDefaults.standard.register(defaults: ["UserAgent" : "Custom Agent"])
Источник: fooobar.com/questions/71394/...
Ранее Objective-C Ответ
С изменениями iOS 5, я рекомендую следующий подход, первоначально из этого вопроса StackOverflow: UIWebView iOS5 изменяет user-agent, как указано в ответе ниже. В комментариях на этой странице, кажется, работает в 4.3 и ранее также.
Измените значение по умолчанию "UserAgent", запустив этот код один раз при запуске приложения:
NSDictionary *dictionary = @{@"UserAgent": @"Your user agent"};
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
[[NSUserDefaults standardUserDefaults] synchronize];
Смотрите предыдущие правки в этом посте, если вам нужны методы, которые работают в версиях iOS до 4.3/5.0. Обратите внимание, что из-за обширных правок следующие комментарии/другие ответы на этой странице могут не иметь смысла. В конце концов, это четырехлетний вопрос. ;-)
Ответ 2
Он должен работать с 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 в свой UIWebView, и webView должен отобразить:
[webView loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)encodingName baseURL:(NSURL *)baseURL];
Ответ 3
У меня тоже была эта проблема, и я пробовал все методы. Я обнаружил, что работает только этот метод (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, - я все это пробовал и контролировал результаты с помощью wirehark, и ничто из этого не работает, потому что Webview все еще использует значение пользовательского агента из пользовательских значений по умолчанию, независимо от того, что вы пытаетесь установить в NSHttpRequest.
Ответ 4
Очень просто в Swift. Просто разместите следующее в своем делете приложения.
UserDefaults.standard.register(defaults: ["UserAgent" : "Custom Agent"])
Если вы хотите добавить к существующей строке оператора, то:
let userAgent = UIWebView().stringByEvaluatingJavaScript(from: "navigator.userAgent")! + " Custom Agent"
UserDefaults.standard.register(defaults: ["UserAgent" : userAgent])
Примечание. Вам может потребоваться удалить и переустановить приложение, чтобы избежать добавления к существующей строке агента.
Ответ 5
Принимая все, как это было решено для меня:
- (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];
}
Спасибо всем.
Ответ 6
Использование @ "User_Agent" просто приводит к появлению настраиваемого заголовка в запросе GET.
User_agent: Foobar/1.0\r\n - User-Agent: 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-пакете, что в сущности подтверждает то, что Sfjava цитировал на этом форуме. Интересно отметить, что "User-Agent" превращается в "User_agent".
Ответ 7
Собственно, добавление любого поля заголовка в аргумент 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.
Ответ 8
Это решение, похоже, было воспринято как довольно умный способ сделать это
changing-the-headers-for-uiwebkit-http-requests
Он использует метод Swizzling, и вы можете узнать больше об этом на странице CocoaDev
Посмотрите на это!
Ответ 9
Объединив ответ Луи Сент-Амура и NSUserDefaults+UnRegisterDefaults
категорию из этого вопроса/ответа, вы можете использовать следующие методы для запуска и остановки спуфинга пользователя-агента в любое время во время работы вашего приложения:
#define kUserAgentKey @"UserAgent"
- (void)startSpoofingUserAgent:(NSString *)userAgent {
[[NSUserDefaults standardUserDefaults] registerDefaults:@{ kUserAgentKey : userAgent }];
}
- (void)stopSpoofingUserAgent {
[[NSUserDefaults standardUserDefaults] unregisterDefaultForKey:kUserAgentKey];
}
Ответ 10
У меня возник такой же вопрос. Я хочу добавить некоторую информацию к пользовательскому агенту, также необходимо сохранить оригинальный пользовательский агент 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];
Используйте его, прежде чем создавать веб-просмотр.
Ответ 11
Попробуйте это в 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];
}
Ответ 12
Единственная проблема, с которой я столкнулся, это изменение только агента пользователя
- (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];
}
Ответ 13
Чтобы добавить пользовательский контент к текущему значению UserAgent, сделайте следующее:
1 - Получить значение пользовательского агента из НОВОГО WEBVIEW
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];