Error de carga de video de YouTube de iOS

Estoy intentando upload un video usando Objective-C y la API de YouTube pero no está funcionando y regrese el error en el último paso. El error dice "Requiere authentication de usuario".

Estoy siguiendo este documento de la API específicamente el que está sin metadatos. Obtuve el token de authentication con ClientLogin API

Revisé el token de authentication con NSLog y está allí. Veo que la API de carga también devuelve la URL de carga, pero cuando envío la request HTTP PUT a la URL de carga recuperada, devuelve un error mencionado anteriormente.

Aquí hay un código de carga

- (bool) upload:(NSString *)file { NSData *fileData = [NSData dataWithContentsOfFile:file]; NSURL *url = [NSURL URLWithString:self.UploadURL]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"PUT"]; [request setValue:@"Content-Type" forHTTPHeaderField:@"application/octet-stream"]; [request setValue:@"Content-Length" forHTTPHeaderField:[NSString stringWithFormat:@"%ud", [fileData length]]]; [request setHTTPBody:fileData]; NSError *requestError; NSURLResponse *urlResponse = nil; NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&requestError]; NSLog(@"%@", [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]); if (response == nil) { return NO; } else { return YES; } } 

También probé el método de carga directa pero esto siempre me da un error de request no válida . A continuación se muestra el código.

 - (bool) directUpload:(NSString *)file { NSString *title = [file lastPathComponent]; NSString *desc = @"This is test video."; NSString *category = @"People"; NSString *keywords = @"video"; NSString *boundary = @"--qwerty"; NSString *xml = [NSString stringWithFormat: @"<?xml version=\"1.0\"?>" @"<entry xmlns=\"http://www.w3.org/2005/Atom\" xmlns:media=\"http://search.yahoo.com/mrss/\" xmlns:yt=\"http://gdata.youtube.com/schemas/2007\">" @"<media:group>" @"<media:title type=\"plain\">%@</media:title>" @"<media:description type=\"plain\">%@</media:description>" @"<media:category scheme=\"http://gdata.youtube.com/schemas/2007/categories.cat\">%@</media:category>" @"<media:keywords>%@</media:keywords>" @"</media:group>" @"</entry>", title, desc, category, keywords]; NSData *fileData = [NSData dataWithContentsOfFile:file]; NSMutableData *postBody = [NSMutableData data]; [postBody appendData:[[NSString stringWithFormat:@"%@\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [postBody appendData:[[NSString stringWithFormat:@"Content-Type: application/atom+xml; charset=UTF-8\n\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [postBody appendData:[xml dataUsingEncoding:NSUTF8StringEncoding]]; [postBody appendData:[[NSString stringWithFormat:@"%@\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [postBody appendData:[[NSString stringWithFormat:@"Content-Type: video/mp4\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [postBody appendData:[[NSString stringWithFormat:@"Content-Transfer-Encoding: binary\n\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [postBody appendData:fileData]; [postBody appendData:[[NSString stringWithFormat:@"%@", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; NSURL *url = [NSURL URLWithString:@"http://uploads.gdata.youtube.com/feeds/api/users/default/uploads"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; [request setValue:[NSString stringWithFormat:@"GoogleLogin auth=\"%@\"", self.AuthToken] forHTTPHeaderField:@"Authorization"]; [request setValue:@"2" forHTTPHeaderField:@"GData-Version"]; [request setValue:[NSString stringWithFormat:@"key=%@", self.DeveloperKey] forHTTPHeaderField:@"X-GData-Key"]; [request setValue:[file lastPathComponent] forHTTPHeaderField:@"Slug"]; [request setValue:[NSString stringWithFormat:@"multipart/related; boundary=\"%@\"", boundary] forHTTPHeaderField:@"Content-Type"]; [request setValue:[NSString stringWithFormat:@"%ud", [postBody length]] forHTTPHeaderField:@"Content-Length"]; [request setValue:@"close" forHTTPHeaderField:@"Connection"]; [request setHTTPBody:postBody]; NSError *requestError; NSURLResponse *urlResponse = nil; NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&requestError]; NSLog(@"%@", [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]); if (response == nil) { return NO; } else { return YES; } }