Какой 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 (который, надеюсь, не потребует полностью повторного его реализации).