2012-03-09 2 views
4

Я пытаюсь загрузить видео с помощью Objective-C и API YouTube, но на последнем этапе он не работает и не возвращает ошибку. Ошибка читает «Требуется аутентификация пользователя».Ошибка загрузки видео на YouTube iOS

Я следую за этим API document конкретно тем, который без метаданных. Я получил токен аутентификации с ClientLogin API

Я проверил токен аутентификации с NSLog, и он есть. Я вижу, что API загрузки также возвращает URL-адрес загрузки, но когда я отправляю HTTP-запрос PUT для получения URL-адреса загрузки, он возвращает ошибку, упомянутую выше.

Вот Загрузить код

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

Я также попытался Прямой метод Загрузить, но это всегда дает мне Invalid Request ошибку. Ниже приведен код.

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

ответ

Смежные вопросы