Ios 尝试在后台上载时,NSURLSessionUploadTask崩溃
在我的应用程序中,当应用程序进入后台时,我尝试将一些数据上传到服务器。 这是我正在使用的代码: 一场 这就是我的会话的设置方式Ios 尝试在后台上载时,NSURLSessionUploadTask崩溃,ios,xcode,nsurlsession,nsurlsessionuploadtask,Ios,Xcode,Nsurlsession,Nsurlsessionuploadtask,在我的应用程序中,当应用程序进入后台时,我尝试将一些数据上传到服务器。 这是我正在使用的代码: 一场 这就是我的会话的设置方式 - (NSURLSession *)backgroundSession { static NSURLSession *session = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSURLSessionConfiguration
- (NSURLSession *)backgroundSession
{
static NSURLSession *session = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.uploadSession"];
configuration.HTTPMaximumConnectionsPerHost = 1;
session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
});
return session;
}
启动上载
上传
//开始按正确的顺序上传剩余gps日志:
NSOperationQueue*队列=[[NSOperationQueue alloc]init];
[队列设置MaxConcurrentOperationCount:1];
对于(int i=0;i
错误
下面是我得到的错误:
我真的希望有人能帮我。我已经调查了我所知道的一切,但似乎无法找出哪里出了问题。
我也尝试过不使用块上传,但结果是一样的
非常感谢您的帮助!对于使用backgroundSessionConfiguration创建的NSURLSession,您必须使用
uploadTaskWithRequest:fromFile:
查看此问题:backgroundSessionConfiguration似乎有问题。当我使用
NSURLSessionConfiguration*配置=[NSURLSessionConfiguration defaultSessionConfiguration]
它在理论上是有效的,但显然不是在我的目标的背景下。我正努力在任何地方看到这一文档。事实上,我似乎看到了相反的情况。uploadTaskWithRequest:fromData:返回一个NSURLSessionPloadTask。具体说明如下:“与数据任务不同,您可以使用上载任务在后台上载内容。“是的,它的文档记录很差。但是你所指的文档与我所说的并不矛盾。仅仅因为你可以在后台使用它们并不意味着你可以使用任何你想要的构造函数。看这个问题:啊,好吧,我现在在措辞中得到了一些微妙之处(顺便说一句,我很高兴接受你说的话;我只是很惊讶文档中没有一些非常明显和清晰的陈述,我们现在可以指出。)是的,这是非常不幸的,我自己浪费了很多时间,因为实现和文档方面的问题。
- (NSURLSession *)backgroundSession
{
static NSURLSession *session = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.uploadSession"];
configuration.HTTPMaximumConnectionsPerHost = 1;
session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
});
return session;
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[self uploadPossibleDrives];
}
// Start uploading the remaing gps log in th right order:
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue setMaxConcurrentOperationCount:1];
for (int i = 0; i < arrayOfGPSLogChunks.count; i++)
{
// This will ensure the chunks are sent in the right order
// Add an operation as a block to a queue:
[queue addOperationWithBlock: ^ {
NSData *requestData;
NSMutableURLRequest *request;
if (i == 0)
{
NSLog(@"Initial drive upload %i",ID.integerValue);
requestData = [NSJSONSerialization dataWithJSONObject:historyToUpload options:NSJSONWritingPrettyPrinted error:nil];
request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:kInitialUploadDriveURL];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
}
else
{
NSLog(@"Chunk %i",i);
NSMutableDictionary *chunk = [[NSMutableDictionary alloc] init];
[chunk setObject:driveID forKey:@"driveID"];
[chunk setObject:[arrayOfGPSLogChunks objectAtIndex:i] forKey:@"gpsLog"];
requestData = [NSJSONSerialization dataWithJSONObject:chunk options:NSJSONWritingPrettyPrinted error:nil];
request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:kUploadDrivesChunkURL]];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
}
NSLog(@"_session: %@",self.session);
NSLog(@"request: %@",request);
NSLog(@"requestData: %lu",(unsigned long)requestData.length);
NSLog(@"uploadTask: %@",self.uploadTask);
self.uploadTask = [self.session uploadTaskWithRequest:request fromData:requestData];
[self.uploadTask resume];
if (i == arrayOfGPSLogChunks.count-1)
{
// All gps logs were uploaded so now we save its state as 'uploaded to server':
NSLog(@"Finished sending to server!");
[self setSentToServerForDriveID:ID];
}
}];
}