问题 我的iOS程序宣传自己的HTTP用户代理是什么?


我为我的播客写了一个应用程序, Otaku没有Podcast。在应用程序的各个部分,我使用 NSURLConnection (获取RSS源), UIWebView (显示网站内容), AVPlayer (从我们的CDN播放MP3音频文件),和 MPMoviePlayerViewController (播放CDN上的视频文件)。现在,由于所有这些都会产生某种类型的HTTP请求,我假设他们会使用标准的iPhone User-agent字符串来宣传自己。 (如果我的假设不正确,请告诉我)这意味着,基于阅读我的日志文件,我无法通过普通的旧移动Safari来告诉我的哪些访问者,而不是使用我的应用程序。

有没有办法将User-Agent更改为我自己的?我发现 关于SO的这个问题 描述如何使用 NSURL 但是我找不到任何关于我正在使用的上述类的信息。


11938
2017-11-06 21:32


起源



答案:


您的原始假设部分不正确 - 自定义用户代理字符串用于您应用的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

据推测,即使网站不是MobileSafari,网站也可以为设备优化HTML。


8
2017-11-06 22:56





根据 这个 博客文章,你可能能够设置一个伪全局用户代理字符串(伪,因为我不知道除了哪些其他类 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 任何 UIWebViews(我猜想 NSURLConnections,如果他们也使用它),使更改生效。


2
2017-11-06 23:11





看看这个相关的问题( 更改NSURLConnection的userAgent ),看起来很容易为NSURLConnection进行用户代理更改。

至于其他类(UIWebView,AVPlayer,MPMoviePlayerViewController),没有简单的方法可以搞乱底层NSURLConnections。

如果您真的想要更改所有HTTP请求的用户代理,我建议您进行调查 Objective-C Class Posing 替换NSURLConnection(希望不需要完全重新实现它)。


1
2017-11-06 22:32