2011-11-06 27 views
11

我已經爲我的播客編寫了一個應用程序,Otaku no Podcast。在應用程序的各個部分,我使用NSURLConnection(獲取RSS提要),UIWebView(顯示網站內容),AVPlayer(播放離我們CDN的MP3音頻文件)和MPMoviePlayerViewController(播放離我們CDN的視頻文件)。現在,由於所有這些都會生成某種類型的HTTP請求,我假設他們將使用標準iPhone用戶代理字符串進行自我宣傳。 (如果我的假設是不正確的,請讓我知道)這意味着,根據閱讀我的日誌文件,我無法通過簡單的舊移動Safari來告訴我的訪問者是誰,而不是使用我的應用程序。我的iOS程序做了什麼HTTP用戶代理?

有沒有辦法將User-Agent更改爲我自己的?我發現this question on SO描述瞭如何與NSURL做到這一點,但我無法找到任何有關我正在使用的上述類的任何信息。

回答

1

看着這個相關的問題(Changing the userAgent of NSURLConnection),它看起來很容易做NSURLConnection的用戶代理更改。

至於其他類(UIWebView,AVPlayer,MPMoviePlayerViewController),沒有簡單的方法來混淆底層的NSURLConnections。

如果你真的想要更改所有HTTP請求的用戶代理,我建議查看Objective-C Class Posing來替換NSURLConnection(希望不需要完全重新實現它)。

8

你原來的假設部分是不正確的 - 自定義的用戶代理字符串用於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

根據this博客文章,您可能能夠設置僞全局用戶代理字符串(pseudo,因爲我不確定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值,但你必須要求releasealloc任何UIWebView(如果他們也使用NSURLConnection),以使更改生效。