共享扩展程序不上传全尺寸图像

我正在开发我的iOS应用程序的共享扩展。 我真的做了所有的事情,但问题是,我的代码只是为小图像工作,但是当我上传从设备相机拍摄的图像,然后上传失败,只有文本得到升级。

- (void)performUploadWith:(NSDictionary *)parameters imageFile:(UIImage *)image{ NSString *boundary = @"SportuondoFormBoundary"; // NSURLSessionConfiguration *configuration= [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:configurationName]; // NSURLSession *session=[NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil]; // NSMutableURLRequest *request;//[NSURLRequest pho] NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 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]; } 

我更新我的代码到这,我检查服务器我的请求永远不会到达服务器。 我正在使用这个代码

  NSInteger randomNumber = arc4random() % 1000000; NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:[NSString stringWithFormat:@"testSession.foo.%d", randomNumber]]; config.sharedContainerIdentifier=kGroupNameToShareData; session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil]; NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromFile:[NSURL URLWithString:[NSString stringWithFormat:@"file://%@", dataSrcImagePath]]]; [uploadTask resume]; 

扩展名不允许有自己的caching磁盘空间。 需要与应用程序分享

上传大图需要caching磁盘空间,所以上传失败。

您需要使用以下代码创buildurl:

 let configName = "com.shinobicontrols.ShareAlike.BackgroundSessionConfig" let sessionConfig = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(configName) // Extensions aren't allowed their own cache disk space. Need to share with application sessionConfig.sharedContainerIdentifier = "group.ShareAlike" let session = NSURLSession(configuration: sessionConfig) 

然后设置应用程序组扩展目标和包含应用程序。

和更多的信息,你可以参考以下链接: http : //www.shinobicontrols.com/blog/posts/2014/07/21/ios8-day-by-day-day-2-sharing-extension

您应该使用后台NSURLSession,因为您打算通过调用NSExtensionContext实例上的completeRequestByReturningItems尽快closures共享UI。

问题是我不使用后台会话

  NSURLSessionConfiguration *configuration= [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:configurationName]; 

 - (void)performUploadWith3:(NSDictionary *)parameters imageFile:(UIImage *)image 

{

 NSString *fileName = @"image.file"; NSString *boundary= @"Boundary+2EB36F87257DBBD4"; NSURL *storeURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:kGroupNameToShareData]; storeURL=[storeURL URLByAppendingPathComponent:fileName]; NSLog(@"sotre url %@",storeURL); NSData *imageData = UIImageJPEGRepresentation(image, 0.8); imageData =[self appendParams:parameters andImage:image bondary:boundary]; if (!([imageData writeToFile:[storeURL path] atomically:YES])) { NSLog(@"Failed to save file."); } NSString *string=@"URL here"; NSURL *url = [NSURL URLWithString:string]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; [request setHTTPMethod:@"POST"]; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; [request setValue:contentType forHTTPHeaderField:@"Content-Type"]; for (NSString *key in parameters) { [request setValue:[parameters objectForKey:key] forHTTPHeaderField:key]; } if (session == nil) { //If this is the first upload in this batch, set up a new session //Each background session needs a unique ID, so get a random number NSInteger randomNumber = arc4random() % 1000000; sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:[NSString stringWithFormat:@"and unique name"]]; sessionConfiguration.sharedContainerIdentifier=kGroupNameToShareData; // config.HTTPMaximumConnectionsPerHost = 1; session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:nil]; //Set the session ID in the sending message structure so we can retrieve it from the //delegate methods later // [sendingMessage setValue:session.configuration.identifier forKey:@"sessionId"]; NSLog(@"config %@",sessionConfiguration.sharedContainerIdentifier); } if([[NSFileManager defaultManager]fileExistsAtPath:[storeURL path]]) { NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromFile:storeURL]; [uploadTask resume]; } else NSLog(@"file does not exsit"); NSLog(@"desc %@",[session sessionDescription]); // NSLog(@"state %ld", [uploadTask state]); }