Изменить пользовательский агент в 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];