2015-05-04 44 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