Пользовательский агент не меняется в NSMutableURLRequest

Я знаю, что с этим может быть несколько проблем, но я столкнулся с проблемой, когда пытаюсь установить новый «пользовательский агент» для моего UIWebView. Вот что я делаю прямо сейчас:

NSURL *myUrl = [NSURL URLWithString:auxUrl];
    NSMutableURLRequest *myRequest = [NSMutableURLRequest requestWithURL:myUrl];

    NSMutableString *auxUserAgent = [[NSMutableString alloc] initWithString:[myRequest valueForHTTPHeaderField: @"User-Agent"]];
    [auxUserAgent appendString:@"(iOS)"];

    [myRequest setValue:auxUserAgent forHTTPHeaderField:@"User-Agent"];

    NSLog(@"UA : %@",[myRequest valueForHTTPHeaderField: @"User-Agent"]);

Я пытаюсь добавить некоторый текст к фактическому пользовательскому агенту, и в консоли XCode он показывает новое значение пользовательского агента.

2013-12-16 19:03:42.200 App[736:60b] UA: Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4, как Mac OS X) AppleWebKit/537.51.1 (KHTML, как Gecko) Mobile/11B554a (iOS)

Но когда я запускаю свое приложение, оно показывает старое. Вот скриншот пользовательского агента, показанного на веб-странице, которую я показываю в UIWebView: ScreenShot

Итак .. мои вопросы: что мне не хватает ?? есть ли что-то в системе, что не позволяет разработчикам изменять эти данные??

Спасибо.


person VaroX    schedule 16.12.2013    source источник
comment
Что произойдет, если вы попробуете @"User-Agent" вместо @"User_Agent"?   -  person Mike Mertsock    schedule 16.12.2013
comment
именно вы упомянули об этом выше, измените его ...   -  person Saad Chaudhry    schedule 16.12.2013
comment
Ничего не происходит ... я пробовал оба варианта до этого вопроса и оставил не тот ... извините за это. Вопрос уже отредактирован! Кроме того... кажется, что UIWebView каким-то образом перезаписывает пользовательский агент, потому что, если я отправлю любой другой параметр заголовка, все будет работать нормально.   -  person VaroX    schedule 17.12.2013


Ответы (2)


Я «решил» свою проблему, вставив в didFinishLaunchingWithOptions моего AppDelegate.m следующий код:

 NSDictionary *dictionnary = [[NSDictionary alloc] initWithObjectsAndKeys:@"YOUR CUSTOM USER-AGENT", @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary];

Дело в том, что я не могу добавить текст к самому пользовательскому агенту, но я могу написать данные, которые мне нужны, чтобы различать доступ к веб-странице из разных приложений или веб-браузеров.

Спасибо за вашу помощь.

person VaroX    schedule 17.12.2013
comment
Прохладный! Кажется, это работает, но это нигде не задокументировано, поэтому его использование в рабочем коде может быть немного опасным... - person Ivan Genchev; 17.12.2013
comment
Я знаю! но я читал, и кажется, что пока вы не используете метод swizzling в классе NSMutableURLRequest, все должно быть более чем хорошо... думаю, посмотрим, что произойдет! :). Если что-то пойдет не так с этим подходом, я дам вам знать. Спасибо, Иван. - person VaroX; 18.12.2013
comment
@VaroX ваше приложение уже поступило в продажу? Я в той же ситуации, что и вы, и мне нужно решить, использовать ли ваш обходной путь или нет. Поэтому я хотел бы знать, пройдет ли это через обзор :) Большое спасибо! - person Toastor; 02.04.2014
comment
Привет @Toastor, нет ... я еще не отправил приложение на проверку, но скоро отправлю! Я дам вам знать, что с ним происходит :) - person VaroX; 03.04.2014
comment
Еще раз здравствуйте @Toastor, я отправил приложение на проверку, и с этим обходным путем проблем не возникло! так что... не стесняйтесь использовать его! - person VaroX; 30.04.2014
comment
Прохладный!! И большое спасибо, что вернулись ко мне! :) Я бы добавил +1 к вашему ответу, но я уже сделал это, поэтому вместо этого я выбрал другой. Или, может быть, два. :п - person Toastor; 30.04.2014
comment
Столкнулся с той же проблемой - это решение, похоже, не сработало для меня! Как вы думаете, как это сработает? просто интересно узнать!! - person thatzprem; 16.12.2014

Это не сработает так. UIWebView переопределяет поле User-Agent.

Если вы попытаетесь зарегистрировать User-Agent в методе webView:shouldStartLoadWithRequest:navigationType:, вы увидите, что он уже переопределен, однако вы можете использовать NSURLConnection для загрузки вашего запроса с помощью пользовательского User-Agent, а затем использовать метод loadHTMLString:baseURL: или метод loadData:MIMEType:textEncodingName:baseURL: из UIWebView для отображения загруженных данных. от NSURLConnection.

person Ivan Genchev    schedule 17.12.2013
comment
Привет, Иван, во-первых, спасибо за ваш ответ... но, не потеряю ли я историю навигации, используя этот метод?? Если да, то это не решение моей проблемы, потому что иногда мне нужно вернуться к предыдущей веб-странице, загруженной в UIWebView. - person VaroX; 17.12.2013
comment
Привет, вам также нужно будет управлять этим самостоятельно, но это будет очень просто. Просто создайте свойство (NSArray или NSMutableArray) в своем контроллере и удерживайте там NSURLRequest. После этого все, что вам нужно сделать, это отменить запрос в webView:shouldStartLoadWithRequest:navigationType: и загрузить свой NSURLRequest с помощью NSURLConnection. - person Ivan Genchev; 17.12.2013