ios - 后台 session 不支持从 NSData 上传任务

标签 ios objective-c iphone

我正在尝试使用共享扩展上传图片,但问题是当我添加后台任务时出现此错误,它表示后台任务不支持 nsdata 但 wwdc session 是在 nsdata 中上传图像。你能告诉我问题出在哪里吗?以及我该如何修复它

后台 session 不支持从 NSData 上传任务

NSString *boundary = @"SportuondoFormBoundary";

NSString * configurationName = @"com.xxxxxxxx.PhotoSharing.backgroundConfiguration";

NSURLSessionConfiguration *configuration= [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:configurationName];
[configuration setSharedContainerIdentifier:kGroupNameToShareData];


configuration.HTTPAdditionalHeaders = @{
                                        @"api-key"       : @"55e76dc4bbae25b066cb",
                                        @"Accept"        : @"application/json",
                                        @"Content-Type"  : [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]
                                        };

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


NSMutableData *body = [NSMutableData data];


for (NSString *key in parameters)
{
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"%@\r\n", [parameters objectForKey:key]] dataUsingEncoding:NSUTF8StringEncoding]];

}

NSData *imageData = UIImageJPEGRepresentation(image, 0.8);
NSLog(@"imageDATE, %@", imageData);
if (imageData)
{
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"image.jpg\"\r\n", @"file"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Type: image/jpg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:imageData];
    [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
}
[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];




// Data uploading task. We could use NSURLSessionUploadTask instead of NSURLSessionDataTask if we needed to support uploads in the background
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",kURLBase,kURLAddPostDL]];
NSLog(@"url %@",url);
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10000];
request.HTTPMethod = @"POST";
request.HTTPBody = body;



NSURLSessionUploadTask *upload=[session uploadTaskWithRequest:request fromData:request.HTTPBody];
[upload resume];

最佳答案

似乎 Up NSURLSessionUploadTask 不支持 Large size NSData, 但是您可以为 NSURLSessionUploadTask 提供文件路径以上传到服务器,或者先将您的图像临时写入磁盘然后提供路径。

这是一个同时上传文件路径和 NSdata 的示例。

Uploads using backgroundSessionConfiguration and NSURLSessionUploadTask cause app to crash

更新:

//Create a file to upload
UIImage *image = [UIImage imageNamed:@"onboarding-4@2x.png"];
NSData *imageData = UIImagePNGRepresentation(image);
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *URLs = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];
NSString *documentsDirectory = [[URLs objectAtIndex:0] absoluteString];

//这是文件路径 URL

NSString *filePath = [documentsDirectory stringByAppendingString:@"testfile.png"];
[imageData writeToFile:filePath atomically:YES];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://file.upload/destination"]];
[request setHTTPMethod:@"PUT"];

//这里使用的是 filePath.

NSURLSessionUploadTask *uploadTask = [upLoadSession uploadTaskWithRequest:request fromFile:[NSURL URLWithString:filePath] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    //code
}];

关于ios - 后台 session 不支持从 NSData 上传任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25660363/

相关文章:

ios - 当我创建一个类并调用在该类中创建的方法时,我遇到错误,它在函数中重定向两次并显示 nil

ios - UIPageViewController 和屏幕外方向更改

ios - 在 Unity iOS 中集成 Adob​​e Omniture

ios - 水平移动 backButtonImage

iphone - Obj-C "@interface"的类文件?

iphone - 自定义 UIView 在 [super dealloc] 上抛出 EXC_BAD_ACCESS

ios - 作为 NSDates 的所有美国假期列表

ios - 为什么我的页面 Controller 不能无限向后滚动?

objective-c - Objective c NSArray 的元素最优雅的语法是什么(相当于 Python 的)?

iphone - 在不重复使用标识符的情况下使用多个自定义单元格