2014-12-05 70 views
2

我試圖通過Action Extension從Photo應用上傳圖片。我使用NSURLSession在後臺上傳它。這是我使用的代碼。Action Extension - 多個NSURLSession

var configName = "com.myapp.uploadImage" 
var config = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(configName) 
config.sharedContainerIdentifier = "group.myApp.sample" 

var session = NSURLSession(configuration: config) 
let task = session.dataTaskWithRequest(request) 
task.resume() 

self.extensionContext!.completeRequestReturningItems(self.extensionContext!.inputItems, completionHandler: nil) 

它工作正常。

問題是,當我上傳圖像並關閉視圖一次,然後嘗試上載第二個圖像,而初始過程仍在後臺運行時,初始NSURLSession未完成。只有第二個過程完成。總之,第二次會議勝過了第一次會議。

我試過使用NSOperationQueue。但行動延伸一度被駁回並在第二屆會議上再次開放,它只是創建了一個新的NSOperationQueue,因此問題仍然存在。

任何建議都會有幫助。提前致謝。

回答

1

確保在第一個仍在運行時不嘗試使用相同標識符實例化第二個後臺會話。保存你的後臺會話,以便以後使用它。

由於URL Loading System Programming Guide: Using NSURLSession的「背景會議注意事項」說:

注意:您必須創建每個標識符(當您創建的配置對象指定)只有一個會話。共享相同標識符的多個會話的行爲未定義。

請注意,該文件還提到一個「必須」指定和實施委託。 (如果沒有別的,如果不這樣做,您將如何知道故障?)App Extension Programming Guide執行上傳和下載部分中提供的示例也指定了委託。

此外,您的主應用的應用委託實施了handleEventsForBackgroundURLSession方法嗎?您必須捕獲completionHandler並在調用NSURLSessionDelegate方法URLSessionDidFinishEventsForBackgroundURLSession時調用它。

最後,我注意到您正在使用數據任務。 NSURLSession文檔明確指出,不應將數據任務與後臺會話一起使用,只能上載/下載任務。我總是認爲這只是因爲你不會嘗試使用didReceiveData委託方法,但我可能會嘗試使用上傳任務,以防其他與後臺會話數據任務相關的問題。

+0

我試過使用不同的標識符。仍然是同樣的問題。 – 2014-12-05 13:47:30

+0

另外,委託方法不會有幫助。正如Apple的指導方針所說的,我們必須解除動作擴展並在後臺運行nsurlsession。所以隨着行動延伸解散,代表也被殺死。 – 2014-12-05 13:49:03

+0

我已經在應用程序中執行了很久的nsurlsessions。它每次都很好。但行動延伸有一個指導方針,這聽起來很合理。 – 2014-12-05 13:51:21