我为我的播客写了一个应用程序, Otaku没有Podcast。在应用程序的各个部分,我使用 NSURLConnection
(获取RSS源), UIWebView
(显示网站内容), AVPlayer
(从我们的CDN播放MP3音频文件),和 MPMoviePlayerViewController
(播放CDN上的视频文件)。现在,由于所有这些都会产生某种类型的HTTP请求,我假设他们会使用标准的iPhone User-agent字符串来宣传自己。 (如果我的假设不正确,请告诉我)这意味着,基于阅读我的日志文件,我无法通过普通的旧移动Safari来告诉我的哪些访问者,而不是使用我的应用程序。
有没有办法将User-Agent更改为我自己的?我发现 关于SO的这个问题 描述如何使用 NSURL
但是我找不到任何关于我正在使用的上述类的信息。
您的原始假设部分不正确 - 自定义用户代理字符串用于您应用的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。
根据 这个 博客文章,你可能能够设置一个伪全局用户代理字符串(伪,因为我不知道除了哪些其他类 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
s(我猜想 NSURLConnection
s,如果他们也使用它),使更改生效。
看看这个相关的问题( 更改NSURLConnection的userAgent ),看起来很容易为NSURLConnection进行用户代理更改。
至于其他类(UIWebView,AVPlayer,MPMoviePlayerViewController),没有简单的方法可以搞乱底层NSURLConnections。
如果您真的想要更改所有HTTP请求的用户代理,我建议您进行调查 Objective-C Class Posing 替换NSURLConnection(希望不需要完全重新实现它)。