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