2012-09-25 27 views
4

我與NSURLConnectionDownloadDelegate 的的iOS 6NSURLConnectionDownloadDelegate expectedTotalBytes零在iOS 6中

connection:didWriteData:totalBytesWritten:expectedTotalBytes: 

方法的問題在的iOS 5模擬器它工作得很好,給我正確的expectedTotalBytes值。

iOS 6模擬器,expectedTotalBytes總是返回0. totalBytesWritten值仍然是正確的。

這是相同的請求,相同的URL,只是操作系統版本是不同的。

有沒有人遇到類似的問題或有任何想法可能會導致此?

乾杯 金

+0

設備上是否發生同樣的事情? –

+0

是的,iOS 6上的iPad也是同樣的東西6 – Alf

+2

可能值得提交bug報告(bugreporter.apple.com)。 –

回答

7

就花了很多時間好量調查相同的問題。事實證明,在iOS6中,首先使用HEAD進行請求以調查頭部,這並不是異常。

但是似乎忽略了來自對實際GET請求的響應的標題。 因此,如果您的服務器不支持HEAD或針對給定URL返回了HEAD請求的0內容長度,則iOS NSURLConnection將使用錯誤信息。

我的問題是,我的自定義服務器不支持HEAD請求我下載的文件,而是返回一個405(HTTP錯誤405方法不允許),它在自己的響應包含內容長度,然後iOS6時使用返回expectedTotalBytes,而不是GET響應中的正確一個。

要解決我的問題,我首先啓用了HEAD來處理我的文件下載請求,然後確保返回了正確的內容長度。已驗證:

curl -v -I http://url 
... 
< Content-Length: 23493947 
Content-Length: 23493947 

不確定這是iOS6中的錯誤還是更符合HTTP標準。希望能幫助別人。

+1

+1完全相同的問題,但不知道如何處理我們的內容託管S3。 – msk

+0

非常感謝,這似乎是問題所在。我們的服務器在HEAD請求中也不返回內容長度的值。它也是一個S3,所以我認爲我們將使用一種解決方法,將響應中的內容長度傳遞給我們自己的服務器的初始請求。 – Alf

+0

S3和簽名請求的問題在於,如果使用簽名請求,您可以指定允許簽名URL使用的單個REST謂詞。該動詞可以是GET或HEAD,但不能兩者都有。所以你需要從另一個頻道獲取Content-Length。樂趣。 – fnf