2016-11-08 72 views
1

我的iOS應用使用NSURLSessionConfiguration,NSURLSession,NSURLSessionDownloadTask等下載我們的服務器從數據庫中即時產生的xml文件。一切工作正常與下載,直到我嘗試從一個特定的帳戶下載更大的文件。我們的服務器在爲此帳戶提供xml之前必須做很多工作。換句話說,在服務器實際吐出所請求的xml之前,會有一些重大的等待。對於這個最大的帳戶,即使服務器成功處理數據並將其發送到客戶端,iOS客戶端也不會收到數據。爲什麼我的NSURLSessionDownloadTask下載無法到達我的客戶端?

測試時,我們發現了一些奇特:

  1. 我們不能下載相同的XML任何Safari瀏覽器(臺式機或iOS)
  2. 我們可以下載使用Chrome的XML在桌面上
  3. 我們可以使用命令行
  4. 在我們的iOS應用上的捲曲下載XML,它不能下載的設備上或在模擬器中XML

我啓動了timeoutIntervalForRequest和timeoutIntervalForResource。它本身不是「超時」的。但是肯定的是,在Apple的網絡堆棧中似乎不允許服務器長時間等待XML生成。爲什麼Chrome和curl沒有問題,但Safari和我的iOS代碼呢?所以,我對這裏發生的事情感到有些不知所措。

這是傳統的服務器代碼,將來會更改爲JSON和更快的類,所以我不需要任何「更改服務器代碼」的答案。

對我而言有什麼想法?提前致謝。

+0

我也試過AFNetworking和捲曲,他們都在項目中失敗。但是我可以在終端上運行相同的捲曲並且它可以工作。 – Erick

回答

2

有兩個超時你會打;第一個是在特定時間段內沒有數據時。另一個是在請求未在特定時間段內完成的情況。這兩者都需要足夠高。我的猜測是,服務器甚至沒有在第一次超時時間內發送狀態碼,導致NSURL堆棧認爲服務器已經死機。

即使您可以調整參數以減少問題,但很有可能唯一真正的答案是「更換服務器」,只是因爲非零的機會(特別是在蜂窩連接中)網絡連接將會隨機下降。

來解決,這將是寫一個小包裝腳本,不帶參數的最簡單方法:

  • 立即返回該資源的唯一標識符(UUID)。
  • 派生異步捲曲作業(在服務器上),以從所述服務器請求資源,並將其寫入到文件中,與UUID作爲名稱
  • 存儲由在libcurl的或My-UUID-Goes-Here.meta類似提供的預期文件長度。
  • 如果出現任何問題,請刪除文件。

或用UUID參數:

  • 可以確保UUID是沒有任何特殊字符的正確UUID。
  • 檢查在特定目錄中是否存在具有該UUID的文件,並驗證文件是否完整。
  • 如果文件不完整,則提供接收的字節數和預期的總字節數(或者只是表示「未就緒」)。
  • 否則,返回文件並立即刪除它。

它可能是十行代碼 - 二十上面 - 加上可能是一個雙行cron腳本來清理超過一天的任何文件。

然後,在那時,你的應用程序可以只是要求數據並取回UUID。然後,它可以定期詢問服務器是否有數據,並且它會立即回覆「這是數據」或「不是」。

+0

有趣的回覆,謝謝! 是的,我有兩個超時值設置天空高。 – Erick

相關問題