Какой HTTP User-Agent моя программа iOS рекламирует как? - PullRequest
12 голосов
/ 07 ноября 2011

Я написал приложение для своего подкаста, Otaku no Podcast . В различных частях приложения я использую NSURLConnection (получение RSS-каналов), UIWebView (отображение содержимого веб-сайта), AVPlayer (воспроизведение аудиофайлов MP3 с нашего CDN) и MPMoviePlayerViewController (воспроизведение видеофайлов с нашего CDN). Теперь, поскольку все они делают HTTP-запросы, я предполагаю, что они будут рекламировать себя со стандартной строкой User-agent iPhone. (если мое предположение неверно, пожалуйста, дайте мне знать) Это означает, что, основываясь на чтении моих файлов журнала, я не могу сказать, кто из моих посетителей заходит через обычный старый мобильный Safari, а не через мое приложение.

Есть ли способ изменить User-Agent на мой собственный? Я нашел этот вопрос на SO , в котором описано, как это сделать с NSURL, но я не могу найти никакой информации ни о одном из перечисленных выше классов, которые я использую.

Ответы [ 3 ]

8 голосов
/ 07 ноября 2011

Ваше первоначальное предположение частично неверно - пользовательская строка User-agent используется для NSURLRequests из вашего приложения. В моем тестировании строка

<product-name>/<build-number> CFNetwork/548.0.3 Darwin/11.2.0

Однако некоторые запросы от UIWebView используют эту строку агента пользователя

Mozilla/5.0 (iPhone Simulator; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9A334

предположительно, чтобы веб-сайты могли оптимизировать свой HTML для устройства, даже если это не MobileSafari.

2 голосов
/ 07 ноября 2011

Согласно этому сообщению в блоге, вы можете установить псевдоглобальную строку User-Agent (псевдо, потому что я не уверен, какие другие классы за пределами UIWebView используют ее).

Вот метод класса, который нужно добавить к вашему главному контроллеру (или делегату приложения):

+ (void)initialize {
    // Set user agent (the only problem is we can't modify it later)
    NSDictionary *dictionary =
    [[NSDictionary alloc] initWithObjectsAndKeys:
     @"Your desired user agent", @"UserAgent", nil];
    [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
    [dictionary release];
}

Согласно комментариям к этому сообщению, "мы не можем изменить его позже", это немного преувеличение: вы можете изменить значение UserAgent позже, но вам придется release и повторно alloc любые UIWebView с (и я полагаю NSURLConnection с, если они тоже его используют), чтобы изменения вступили в силу.

1 голос
/ 07 ноября 2011

Глядя на этот связанный вопрос ( Изменение userAgent для NSURLConnection ), кажется, что довольно легко внести изменения в пользовательский агент для NSURLConnection.

Что касается других классов (UIWebView, AVPlayer, MPMoviePlayerViewController), то нет простого способа связываться с базовыми NSURLConnections.

Если вы действительно хотите изменить пользовательский агент для всех HTTP-запросов, я бы посоветовал изучить Постановка класса Objective-C , чтобы заменить NSURLConnection (который, мы надеемся, не потребует полного его переопределения).

...