youtube上传错误:GTLJSONRPCErrorDomain代码= 401

时间:2016-01-27 12:41:36

标签: ios youtube-api

当我尝试登录YouTube并上传视频时,上传时没有任何问题。如果我在2-3小时后上传视频,我会收到错误消息,

Error: Error Domain=com.google.GTLJSONRPCErrorDomain Code=401 "The operation couldn’t be completed. (Invalid Credentials)" UserInfo=0x14585d90 {error=Invalid Credentials, GTLStructuredError=GTLErrorObject 0x14d85ba0: {message:"Invalid Credentials" code:401 data:[1]}, NSLocalizedFailureReason=(Invalid Credentials)}

以下是执行Youtube登录的代码,

GIDSignIn *googleSignIn = [GDSharedInstance googleSDKApplicationSharedInstance];
    googleSignIn.delegate = self;
    googleSignIn.scopes  = [NSArray arrayWithObject:@"https://www.googleapis.com/auth/youtube"];
    [googleSignIn signIn];

登录代表

  - (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user withError:(NSError *)error
    { 
// Auth is converted to use it for uploading a video
     GTMOAuth2Authentication *youTubeAuth = [[GTMOAuth2Authentication alloc] init];

        youTubeAuth.clientID = kClientID;
        youTubeAuth.clientSecret = @"xxx";
        youTubeAuth.userEmail = googleUser.profile.email;
        youTubeAuth.userID = googleUser.userID;
        youTubeAuth.accessToken = googleUser.authentication.accessToken;
        youTubeAuth.refreshToken = googleUser.authentication.refreshToken;
        youTubeAuth.expirationDate = googleUser.authentication.accessTokenExpirationDate;
        self.youTubeService.authorizer = youTubeAuth;
    }

上传代码,

NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingFromURL:[NSURL URLWithString:path] error:&error];
    if (fileHandle) {
        NSString *mimeType = [self MIMETypeForFilename:filename
                                       defaultMIMEType:@"video/mov"];
        GTLUploadParameters *uploadParameters =
        [GTLUploadParameters uploadParametersWithFileHandle:fileHandle
                                                   MIMEType:mimeType];
        uploadParameters.uploadLocationURL = locationURL;

        GTLQueryYouTube *query = [GTLQueryYouTube queryForVideosInsertWithObject:video
                                                                            part:@"snippet,status,recordingDetails"
                                                                uploadParameters:uploadParameters];
            GTLServiceYouTube *service = self.youTubeService;

            self.uploadFileTicket = [service executeQuery:query
                                    completionHandler:^(GTLServiceTicket *ticket,
                                                        GTLYouTubeVideo *uploadedVideo,
                                                        NSError *error)
                                     {
                                        // here I will get 401 error
                                    }];

     }

2 个答案:

答案 0 :(得分:1)

唯一的问题是GTLServiceYouTube。 GIDSignIn似乎处理刷新令牌,因此用户始终在首次登录后登录。但是GTLOAuth2Authentication仅在首次登录时有效,并在一小时后被破坏。

需要刷新令牌。

使用这段代码: -

- (void)applicationWillEnterForeground:(UIApplication *)application {

 [[GIDSignIn sharedInstance] signInSilently]

}

答案 1 :(得分:0)

此处的问题是您的身份验证令牌即将到期。在旧令牌过期后,您必须使用刷新令牌获取新的有效身份验证令牌。

如果您使用的是旧版Google Plus iOS SDK,则可以使用GTMOAuth2Authentication强制使用authorizeRequest:方法刷新身份验证令牌。

来自GTMOAuth2Authentication.h

// The request argument may be nil to just force a refresh of the access token,
// if needed.

- (void)authorizeRequest:(NSMutableURLRequest *)request
       completionHandler:(void (^)(NSError *error))handler;

实现:

// In your sign in method
[[GPPSignIn sharedInstance] setKeychainName:@"googleAuth"];

// ...

// Retrieving auth and refreshing token
GTMOAuth2Authentication *auth;
auth = [GTMOAuth2ViewControllerTouch authForGoogleFromKeychainForName:@"googleAuth"
                                                             clientID:@"kYourGoogleClientId"
                                                         clientSecret:@"kYourGoogleClientSecret"];

NSLog(@"old auth: %@", auth);

[auth authorizeRequest:nil completionHandler:^(NSError *error) {
    if (error) {
        // no auth data or refresh failed
        NSLog(@"Error: %@", error);
    } else {
        // Auth token refresh successful
        NSLog(@"new auth: %@", auth);
    }
}];