Share Extension not uploading full size images

2019-04-11 17:12发布

问题:

i am developeing share extension for my iOS application. i had really done every thing but the problem is that my code is only working for small images but when i upload image taken from device camer then uploading fails and only text get uploded.

- (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];
}

i update my code to this and i check on server my request never reaches to server. I am using this code

        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];

回答1:

Extensions aren't allowed their own cache disk space. Need to share with application

Uploading large image need cache disk space,so you upload failed.

You need create url session with following codes:

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)

and then setting the app group both extension target and containing app.

and more infomations you can refer following link: http://www.shinobicontrols.com/blog/posts/2014/07/21/ios8-day-by-day-day-2-sharing-extension



回答2:

You should be using a background NSURLSession since you are meant to dismiss the sharing UI as soon as possible by calling completeRequestByReturningItems on your NSExtensionContext instance.



回答3:

The problem is i am not using background session

  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]);

    }