Изменить пользовательский агент в UIWebView

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

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

66 голосов | спросил Steve Murch 26 Jam1000000amMon, 26 Jan 2009 00:57:56 +030009 2009, 00:57:56

13 ответов


0

Modern Swift

Вот предложение для проектов 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 изменение user-agent , как указано в ответе ниже. В комментариях на этой странице он работает также в 4.3 и более ранних версиях.

  

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

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

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

ответил AnoopGoudar 27 MaramTue, 27 Mar 2018 09:45:12 +03002018-03-27T09:45:12+03:0009 2018, 09:45:12
0

У меня тоже была эта проблема, и я попробовал все методы. Я обнаружил, что работает только этот метод (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 по-прежнему использует Значение агента пользователя от значения по умолчанию пользователя, независимо от того, что вы пытаетесь установить в NSHttpRequest.

ответил winitzki 19 J0000006Europe/Moscow 2012, 12:01:15
0

Он должен работать с 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];
ответил Dshutsi 18 FebruaryEurope/MoscowbWed, 18 Feb 2009 00:16:39 +0300000000amWed, 18 Feb 2009 00:16:39 +030009 2009, 00:16:39
0

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

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

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

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

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

ответил PassKit 6 SatEurope/Moscow2014-12-06T14:10:05+03:00Europe/Moscow12bEurope/MoscowSat, 06 Dec 2014 14:10:05 +0300 2014, 14:10:05
0

Фактически добавление любого поля заголовка к аргументу 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.

ответил Danra 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 21 Sep 2010 17:57:24 +0400 2010, 17:57:24
0

Использование @ "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; ru) AppleWebKit /528.18 (KHTML, например   Gecko) Mobile /7D11 \ r \ n

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

ответил dodeskjeggen 12 Jpm1000000pmTue, 12 Jan 2010 23:39:31 +030010 2010, 23:39:31
0

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

- (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];
}

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

ответил Michael Robinson 6 Jam1000000amWed, 06 Jan 2010 00:23:14 +030010 2010, 00:23:14
0

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

change- -заголовков-для-uiwebkit-HTTP-запросов

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

Посмотри!

ответил Open SEO 5 PM00000080000005831 2010, 20:13:58
0

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

#define kUserAgentKey @"UserAgent"

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

- (void)stopSpoofingUserAgent {
    [[NSUserDefaults standardUserDefaults] unregisterDefaultForKey:kUserAgentKey];
}
ответил EthanB 7 PM00000090000002331 2013, 21:36:23
0

Я столкнулся с тем же вопросом. Я хочу добавить некоторую информацию в 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];

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

ответил Shannon Chou 14 Maypm14 2014, 16:10:34
0

Попробуйте это в 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];

}
ответил Aitul 17 Jpm1000000pmThu, 17 Jan 2013 16:28:29 +040013 2013, 16:28:29
0

Единственной проблемой, которую я обнаружил, было изменение только пользовательского агента

- (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];
}
ответил Sanjeev sharma 8 FebruaryEurope/MoscowbFri, 08 Feb 2013 16:10:33 +0400000000pmFri, 08 Feb 2013 16:10:33 +040013 2013, 16:10:33
0

Чтобы просто добавить пользовательский контент к текущему значению UserAgent, выполните следующие действия:

1 - получить значение агента пользователя из НОВОГО WEBVIEW

2 - добавить пользовательский контент к нему

3 - сохранить новое значение в словаре с помощью ключа UserAgent

4 - Сохраните словарь в стандартных пользовательских правах.

Смотрите пример ниже:

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];
ответил Doug 11 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 11 Sep 2015 22:02:50 +0300 2015, 22:02:50

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132