objective-c - iOS YouTube 视频上传错误

标签 objective-c ios youtube

我正在尝试使用 Objective-C 和 YouTube API 上传视频,但它无法正常工作并在最后一步返回错误。错误显示为“需要用户身份验证”。

我正在关注这个 API document特别是没有元数据的那个。我通过 ClientLogin API 获得了身份验证 token

我用 NSLog 检查了身份验证 token ,它就在那里。我看到上传 API 也返回上传 URL,但是当我向检索到的上传 URL 发送 HTTP PUT 请求时,它返回上述错误。

这是上传代码

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

我也尝试了直接上传方法,但这总是给我无效请求错误。下面是代码。

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

最佳答案

关于objective-c - iOS YouTube 视频上传错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9632008/

相关文章:

youtube - 如何在最后一帧暂停嵌入的 YouTube 视频?

javascript - 根据 YouTube 视频当前时间运行倒数计时器

android - 带有抽屉导航的 YouTubePlayerSupportFragment 和错误 YouTube 视频播放由于播放器顶部未经授权的覆盖而停止

objective-c - 将自定义字体设置为粗体

android - 如何将用户从移动应用程序重定向到移动网络浏览器?

android - 在 flutter 中仅显示图像的顶部部分

iphone - 从文档目录读取 plist 文件时为空

ios - 关于 "location-based APIs for emergency services"上的苹果拒绝

ios - 屏幕分辨率

ios - Alamofire 单例 webservercall 类错误