2017-08-11 72 views
1

我正在開發一個應用程序,每天都需要更新我應用程序中的數據。我決定使用後臺抓取。我從API下載數據,所以我使用URLSession。由於performFetchWithCompletionHandler中沒有允許完成處理程序,因此我正在使用委託來實現此目的。但我的問題是,當我嘗試更新數據時,我的應用程序沒有運行功能didRecieve data未被調用。我做錯了什麼,或者我應該使用其他什麼來每天從API更新數據?在後臺抓取中使用URLSession更新數據

我的代碼如下:

func createTask(url: String, id: String){ 
    let accessKey = UserDataService().getCurrentUser().accessToken 

    let backgroundConfigObject = URLSessionConfiguration.background(withIdentifier: id + UUID().uuidString) 
    let backgroundSession = URLSession(configuration: backgroundConfigObject, delegate: self, delegateQueue: nil) 


    var request = URLRequest(url: URL(string: url)!) 
    request.setValue("Bearer \(accessKey!)", forHTTPHeaderField: "Authorization") 
    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    request.httpMethod = "GET" 

    let task = backgroundSession.dataTask(with: request) 

    task.resume() 

    print("task resumed") 
} 

這個函數被調用內部performFetchWithCompletionHandler並創建新dataTaskdidRecieve data不叫。

我也嘗試添加內部performFetchWithCompletionHandler

print("BG FETCH") 

let url = "secret url" 

var request = URLRequest(url: URL(string: url)!) 
request.setValue("SOME KEY", forHTTPHeaderField: "Authorization") 
request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
request.httpMethod = "GET" 

URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) in 
    print("DATA",data) 
    completionHandler(.newData) 
}).resume() 

謝謝你的任何建議,這個代碼!

+0

我不確定,但非常懷疑它可以*從backgroundState *開始* backgroundSession。 如果它已經*在前臺啓動,則只能繼續。想象一下,如果應用程序能夠進行長時間的後臺下載並且用戶永遠不知道,並且使用他的手機數據下載了實現的5Gb,會發生什麼情況。他們會立即刪除您的應用程序! – Honey

+0

@Honey然後你有什麼建議。我的應用程序取決於更新。 – Phyber

+0

我還沒有使用過後臺App刷新,但看了一下,沒有看到任何提及:「在performFetchWithCompletionHandler中不允許完成處理程序」< - 爲什麼你要這樣說?這是基於文檔嗎? – Honey

回答

0

據我記得,只有上傳下載支持後臺,而不是數據任務。

你說得對,你不能使用帶有完成句柄的調用。你必須提供一個委託。

在Xcode中搜索字符串「在後臺下載內容」。有相當廣泛的文檔。

它的要點是系統會根據需要重新啓動您的應用程序並調用它的application:handleEventsForBackgroundURLSession:completionHandler:方法。

您必須在您的info.plist文件中設置正確的應用程序權限。 (我不記得,如果你要問允許做後臺下載或沒有用戶請參閱該文檔。)

下面是信息的從蘋果的Xcode文件的第一部分:

在背景技術

下載內容當下載的文件,應用應使用NSURLSession目的是 開始下載,以使系統可以採取 下載過程的情況下,應用程序被暫停或終止的控制。當您爲 配置NSURLSession對象以進行後臺傳輸時,系統 會管理這些傳輸,並以通常方式將您的應用程序的狀態報告回 。如果您的應用在 傳輸正在進行時終止,系統將繼續傳輸 背景,並在傳輸 完成時或當一個或多個任務需要您的應用關注時啓動您的應用(如適用)。

要支持後臺傳輸,您必須適當地配置您的NSURLSession 對象。要配置會話,您必須先創建一個NSURLSessionConfiguration對象並設置 多個屬性爲 適當的值。然後在創建 會話時,將該配置對象傳遞給適當的NSURLSession初始化方法 。

用於創建支持 後臺下載配置對象的過程如下:

創建使用 backgroundSessionConfigurationWithIdentifier配置對象: NSURLSessionConfiguration的方法。將配置對象的 sessionSendsLaunchEvents屬性的值設置爲YES。如果您的應用程序在前臺處開始傳輸 ,則建議您還將配置對象的 任意屬性設置爲YES。根據需要配置 配置對象的任何其他屬性。使用 配置對象來創建您的NSURLSession對象。一旦配置了 ,您的NSURLSession對象將在適當的時候無縫地將上傳和 下載任務移交給系統。如果任務在應用程序仍在運行時完成 (無論是在前臺還是在 後臺),會話對象都會以通常的 方式通知其代表。如果任務尚未完成且系統終止您的應用程序,系統將自動繼續管理背景中的任務 。如果用戶終止您的應用程序,系統將取消任何 待處理任務。

當所有的與背景會話相關的任務 完成後,系統將重新啓動已終止的應用程序(假設 sessionSendsLaunchEvents屬性設置爲YES,並且用戶也 沒有強制退出應用程序),並調用應用程序委託人 應用程序:handleEventsForBackgroundURLSession:completionHandler: 方法。 (該系統還可以重新啓動應用程序來處理身份驗證 挑戰或需要您的應用 關注其他任務相關的事件。)在你的實現是委託方法,使用 提供的標識符,以創建一個新的NSURLSessionConfiguration和 NSURLSession物體與之前相同的配置。系統 將您的新會話對象重新連接到之前的任務,並將其狀態報告給會話對象的委託。