Какой HTTP-агент-агент выполняет мою iOS-программу, рекламирую себя как?
Я написал приложение для своего подкаста, Otaku no Podcast. В различных частях приложения я использую NSURLConnection
(выборка RSS-каналов), UIWebView
(отображение содержимого веб-сайта), AVPlayer
(воспроизведение аудиофайлов MP3 с нашего CDN) и MPMoviePlayerViewController
(воспроизведение видеофайлов с нашего CDN). Теперь, поскольку все они делают HTTP-запросы какого-то рода, я предполагаю, что они будут рекламировать себя со стандартной строкой User-agent iPhone. (если мое предположение неверно, пожалуйста, дайте мне знать) Это означает, что, основываясь на чтении моих файлов журналов, я не могу сказать, кто из моих посетителей приходит через обычный старый Safari Safari, а не через мое приложение.
Есть ли способ изменить User-Agent на один из моих? Я нашел этот вопрос на SO описывает, как это сделать с помощью NSURL
, но я не могу найти никакой информации о каких-либо из вышеперечисленных классов, которые я использую.
Ответы
Ответ 1
Исходное предположение частично неверно. Пользовательская строка пользовательского агента используется для NSURLRequests из вашего приложения. В моем тестировании строка
<product-name>/<build-number> CFNetwork/548.0.3 Darwin/11.2.0
Однако некоторые запросы от UIWebView используют эту строку user-agent
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
Согласно сообщению this в блоге, вы можете установить псевдо-глобальную строку 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
и re alloc
любой UIWebView
(и я предполагаю NSURLConnection
, если они его используют), чтобы изменения вступили в силу.
Ответ 3
Рассматривая этот связанный вопрос (Изменение userAgent из NSURLConnection), похоже, довольно легко сделать изменение пользовательского агента для NSURLConnection.
Что касается других классов (UIWebView, AVPlayer, MPMoviePlayerViewController), нет простого способа объединиться с базовыми NSURLConnections.
Если вы действительно хотите изменить пользовательский агент для всех HTTP-запросов, я бы предложил посмотреть Objective-C Class Posing на замените NSURLConnection (который, надеюсь, не потребует полностью повторного его реализации).