2015-05-04 45 views
0

我有一個應用程序上傳TSPhoto對象數組中保存的幾張圖片。NSURLSessionUploadTask「完成」,但沒有網絡流量

當我開始上傳,委託方法最終觸發說,它的完成,但應用始終命中服務器和工具沒有顯示任何網絡流量

_session = [self backgroundSession]; 

for(TSPhoto *photo in _picsetPhotos) { 
    NSURL *uploadURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@upload", @"https://example.com/"]]; 
    NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:uploadURL]; 
    [req setHTTPMethod:@"POST"]; 

    NSLog(@"req dump: %@", req); 

    // Add it to the queue 
    NSURLSessionUploadTask *uploadTask = [_session uploadTaskWithRequest:req fromFile:[NSURL fileURLWithPath:photo.fullImagePath]]; 

    // "Start" it 
    NSLog(@"Enqueueing %@", uploadTask); 

    [uploadTask resume]; 
    NSLog(@"Post-resume"); 
} 

-backgroundSession:

-(NSURLSession *)backgroundSession { 
    static NSURLSession *session = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"TSBackgroundUploader"]; 

     configuration.HTTPMaximumConnectionsPerHost = 1; 

     session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil]; 
    }); 

    return session; 
} 

我已經實現了所有的適當的委託方法:

-(void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session { 
    NSLog(@"Finished all uploads!"); 
    [[[UIAlertView alloc] initWithTitle:@"Upload Completed" message:@"Your album has been created." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show]; 
} 

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend { 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [_uploadProgress setProgress: 
     (double)totalBytesSent/
     (double)totalBytesExpectedToSend animated:YES]; 
    }); 
} 

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; 

     [_uploadProgress setProgress:0.5]; 

     // Did we succeed? 
     if(!error) { 
      NSLog(@"Upload done"); 
     } else { 
      NSLog(@"%@", error.description); 
     } 
    }); 

進度條也起到真的靠不住的過程中這一切,上升和下降,直至最終達到100

任何線索可能什麼呢?

編輯: 以下是我添加了一些NSLog報表後的日誌。這些任務以與它們開始相反的順序呼叫代表:

2015-05-04 09:55:42.492 TS[348:95052] Starting background upload 
2015-05-04 09:55:42.493 TS[348:95052] req dump: <NSMutableURLRequest: 0x1740138b0> { URL: https://example.com/upload } 
2015-05-04 09:55:42.512 TS[348:95052] Enqueueing <__NSCFBackgroundUploadTask: 0x155d804c0>{ taskIdentifier: 3 } 
2015-05-04 09:55:42.513 TS[348:95052] Post-resume 
2015-05-04 09:55:42.513 TS[348:95052] req dump: <NSMutableURLRequest: 0x17400de00> { URL: https://example.com/upload } 
2015-05-04 09:55:42.524 TS[348:95052] Enqueueing <__NSCFBackgroundUploadTask: 0x155e68db0>{ taskIdentifier: 4 } 
2015-05-04 09:55:42.525 TS[348:95052] Post-resume 
2015-05-04 09:56:01.726 TS[348:95052] ID: 4 
2015-05-04 09:56:01.726 TS[348:95052] Upload done 
2015-05-04 09:56:02.920 TS[348:95052] ID: 3 
2015-05-04 09:56:02.920 TS[348:95052] Upload done 
+0

究竟日誌包含什麼,以及哪些任務調用委託回來? – Wain

+0

@Wain:編輯添加日誌。 – Timothy

+0

你如何測試服務器端的數據?你使用VPN嗎?你試過跟查爾斯追蹤過嗎?當您將每個任務更新爲100%時,進度非常混亂,然後當每個任務完成時重置爲50%。 – Wain

回答

0

我的一部分感覺真的很愚蠢,我的一部分真的很困惑。

事實證明,數據被髮送。我正在處理一個不完整的上傳端點,當我完成端點的實現時,圖片經過了很好的處理!

但對於整個事務 - 圖片的上傳10MB價值 - 唯一的網絡流量一下顯示在調試器是我做較小的請求,幾KB之前開始的任務:

enter image description here

我想我只是將這一個文件寫在「Xcode所做的奇怪的狗屎」之下,然後繼續前進。

1

您看不到任何網絡活動,因爲後臺會話在由系統管理的單獨守護程序上傳輸數據。

這是來自蘋果文檔的摘錄:

「一旦配置好,你NSURLSession對象無縫放手上傳和下載任務系統在適當的時候如果任務完成,而你的應用程序仍在運行(無論是在前臺還是在後臺),會話對象都會以通常的方式通知其委託,如果任務還沒有完成,系統終止你的應用程序,系統將自動繼續管理後臺中的任務,如果用戶終止你的應用程序,系統取消任何待處理的任務。「

你可以在這裏閱讀更多: https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html