Youtube视频上传IOS错误403

时间:2017-08-03 14:48:20

标签: ios objective-c youtube youtube-api

在我的项目中想要有这样的流程:

用户录制短视频 - >他们在我的频道上传视频 - >端

要实现此结果,我正在尝试使用适用于REST的Objective-C的新Google API客户端库。它的文档很差,示例仅适用于mac。无论如何,经过多次错误,这是我的代码:

- (void)doAuthWithoutCodeExchange:(OIDServiceConfiguration *)configuration
                         clientID:(NSString *)clientID
                     clientSecret:(NSString *)clientSecret {
    NSURL *redirectURI = [NSURL URLWithString:kRedirectURI];

    // builds authentication request
    OIDAuthorizationRequest *request =
    [[OIDAuthorizationRequest alloc] initWithConfiguration:configuration
                                                  clientId:clientID
                                              clientSecret:clientSecret
                                                    scopes:@[ OIDScopeOpenID, OIDScopeProfile ]
                                               redirectURL:redirectURI
                                              responseType:OIDResponseTypeCode
                                      additionalParameters:nil];
    // performs authentication request
    AppDelegate *appDelegate = (AppDelegate *) [UIApplication sharedApplication].delegate;
    [self logMessage:@"Initiating authorization request %@", request];
    appDelegate.currentAuthorizationFlow =
    [OIDAuthorizationService presentAuthorizationRequest:request
                                presentingViewController:self
                                                callback:^(OIDAuthorizationResponse *_Nullable authorizationResponse,
                                                           NSError *_Nullable error) {
                                                    if (authorizationResponse) {
                                                        OIDAuthState *authState =
                                                        [[OIDAuthState alloc] initWithAuthorizationResponse:authorizationResponse];
                                                        [self setAuthState:authState];

                                                        [self logMessage:@"Authorization response with code: %@",
                                                         authorizationResponse.authorizationCode];
                                                        // could just call [self tokenExchange:nil] directly, but will let the user initiate it.

                                                        OIDTokenRequest *tokenExchangeRequest =
                                                        [_authState.lastAuthorizationResponse tokenExchangeRequest];

                                                        [self logMessage:@"Performing authorization code exchange with request [%@]",
                                                         tokenExchangeRequest];

                                                        [OIDAuthorizationService performTokenRequest:tokenExchangeRequest
                                                                                            callback:^(OIDTokenResponse *_Nullable tokenResponse,
                                                                                                       NSError *_Nullable error) {

                                                                                                if (!tokenResponse) {
                                                                                                    [self logMessage:@"Token exchange error: %@", [error localizedDescription]];
                                                                                                } else {
                                                                                                    [self logMessage:@"Received token response with accessToken: %@", tokenResponse.accessToken];
                                                                                                }

                                                                                                [_authState updateWithTokenResponse:tokenResponse error:error];

                                                                                                GTMAppAuthFetcherAuthorization *gtmAuthorization =
                                                                                                [[GTMAppAuthFetcherAuthorization alloc] initWithAuthState:authState];

                                                                                                // Sets the authorizer on the GTLRYouTubeService object so API calls will be authenticated.
                                                                                                self.youTubeService.authorizer = gtmAuthorization;

                                                                                                // Serializes authorization to keychain in GTMAppAuth format.
                                                                                                [GTMAppAuthFetcherAuthorization saveAuthorization:gtmAuthorization
                                                                                                                                toKeychainForName:kGTMAppAuthKeychainItemName];

                                                                                                [self uploadVideoFile];

                                                                                            }];







                                                    } else {
                                                        [self logMessage:@"Authorization error: %@", [error localizedDescription]];
                                                    }
                                                }];
}

此方法导致此流程:

app将用户发送到safari中的google登录页面 - >用户使用他的凭据登录 - >登录后,用户将重定向回我的应用程序 - >块成功调用方法UploadVideo。

这部分流程似乎工作正常,我获得了一个有效的令牌,如日志所示。第二部分是视频上传,包含两个主要方法:

- (void)uploadVideoFile {
    // Collect the metadata for the upload from the user interface.
    // Status.
    GTLRYouTube_VideoStatus *status = [GTLRYouTube_VideoStatus object];
    status.privacyStatus = @"public";

    // Snippet.
    GTLRYouTube_VideoSnippet *snippet = [GTLRYouTube_VideoSnippet object];
    snippet.title = @"title";
    NSString *desc = @"description";
    if (desc.length > 0) {
        snippet.descriptionProperty = desc;
    }
    NSString *tagsStr = @"tags";
    if (tagsStr.length > 0) {
        snippet.tags = [tagsStr componentsSeparatedByString:@","];
    }

    GTLRYouTube_Video *video = [GTLRYouTube_Video object];
    video.status = status;
    video.snippet = snippet;

    [self uploadVideoWithVideoObject:video
             resumeUploadLocationURL:nil];
}


- (void)uploadVideoWithVideoObject:(GTLRYouTube_Video *)video
           resumeUploadLocationURL:(NSURL *)locationURL {
    NSURL *fileToUploadURL = [NSURL fileURLWithPath:self.VideoUrlCri.path];
    NSError *fileError;
    NSLog(@"step");
    if (![fileToUploadURL checkPromisedItemIsReachableAndReturnError:&fileError]) {

        NSLog(@"exit");

        return;
    }

    // Get a file handle for the upload data.
    NSString *filename = [fileToUploadURL lastPathComponent];
    NSString *mimeType = [self MIMETypeForFilename:filename
                                   defaultMIMEType:@"video/mp4"];
    GTLRUploadParameters *uploadParameters =
    [GTLRUploadParameters uploadParametersWithFileURL:fileToUploadURL
                                             MIMEType:mimeType];
    uploadParameters.uploadLocationURL = locationURL;

    GTLRYouTubeQuery_VideosInsert *query =
    [GTLRYouTubeQuery_VideosInsert queryWithObject:video
                                              part:@"snippet,status"
                                  uploadParameters:uploadParameters];


    query.executionParameters.uploadProgressBlock = ^(GTLRServiceTicket *ticket,
                                                      unsigned long long numberOfBytesRead,
                                                      unsigned long long dataLength) {
        NSLog(@"upload progress");

    };

    GTLRYouTubeService *service = self.youTubeService;
    _uploadFileTicket = [service executeQuery:query
                            completionHandler:^(GTLRServiceTicket *callbackTicket,
                                                GTLRYouTube_Video *uploadedVideo,
                                                NSError *callbackError) {

                                if (callbackError == nil) {
                                    NSLog(@"uploaded");


                                } else {

                                     NSLog(@"error %@",callbackError);
                                }


                            }];

}

- (NSString *)MIMETypeForFilename:(NSString *)filename
                  defaultMIMEType:(NSString *)defaultType {
    NSString *result = defaultType;
    NSString *extension = [filename pathExtension];
    CFStringRef uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension,
                                                            (__bridge CFStringRef)extension, NULL);
    if (uti) {
        CFStringRef cfMIMEType = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType);
        if (cfMIMEType) {
            result = CFBridgingRelease(cfMIMEType);
        }
        CFRelease(uti);
    }
    return result;
}

我在NSLog(@"error %@",callbackError);中收到403错误,我看不到错误详情,因为它类似于:

data=<7b226572 726f7222 3a7b2265 72726f72 73223a5b 7b22646f 6d61696e 223a2267 6c6f6261 6c222c22 72656173 6f6e223a 22696e73 75666669 ... 61676522 3a22496e 73756666 69636965 6e742050 65726d69 7373696f 6e227d7d>}

在google api控制台中,我为我的应用程序包和API密钥创建了一个Client Oauth,我将这些值用于我的连接,看起来它们正常工作,因为我获得了一个有效的令牌。无论如何,有人可以帮助我或指出我正确的方向这个错误?或者有人知道有关IOS视频上传的工作示例而不是MAC?我的代码有些奇怪吗?我在文档或谷歌中找不到任何帮助

0 个答案:

没有答案