GTMOAuth2Authentication не работает

Я пытаюсь использовать API Google OAuth2 и YouTube. OAuth возвращается GTMOAuth2Authentication объект, который вы затем используете для отправки запросов на такие сервисы, как YouTube. Мой логин работает нормально, и когда я вручную передаю объект аутентификации, я могу делать запросы.

Тем не менее, я также должен иметь возможность доступа к объекту аутентификации через цепочку для ключей, и я получаю действительный объект, но если я пытаюсь использовать его для отправки запросов, я не могу. Я продолжаю получать следующую ошибку: "Операция не может быть завершена. (Com.google.GTMHTTPFetcher error -1.)" Я был бы признателен, если бы кто-то мог указать на мою ошибку. Я тестирую на реальном iPhone 5s.

Код аутентификации:

GTMOAuth2ViewControllerTouch * viewController = [[GTMOAuth2ViewControllerTouch alloc]
                                                 initWithScope:scope
                                                 clientID:kGoogleClientID
                                                 clientSecret:kGoogleClientSecret
                                                 keychainItemName:kGoogleKeychainItemName
                                                 delegate:self
                                                 finishedSelector:@selector(viewController:
                                                                            finishedWithAuth:
                                                                            error:)];
[self.navigationController pushViewController:viewController animated:YES];

Обработчик завершения аутентификации:

- (void)viewController:(GTMOAuth2ViewControllerTouch *)viewController
      finishedWithAuth:(GTMOAuth2Authentication *)auth
                 error:(NSError *)error {

    NSLog(@"%s", __PRETTY_FUNCTION__);

    if (error != nil) {
        NSLog(@"%s %@", __PRETTY_FUNCTION__, error.localizedDescription);
        return;
    }

    MediaGETWrapper *getWrapper = [MediaGETWrapper sharedWrapper];
    getWrapper.googleAuth = auth; // passing auth directly without keychain

    [getWrapper youTubeSubscriptionsWithSuccess:nil failure:nil];

Инициализация клиента YouTube:

self.youTube = [GTLServiceYouTube new];
GTMOAuth2Authentication *auth = [GTMOAuth2Authentication new];

[GTMOAuth2ViewControllerTouch
 authorizeFromKeychainForName:kGoogleKeychainItemName
 authentication:auth
 error:nil];

self.youTube.authorizer = auth;

Запрос:

- (void)youTubeSubscriptionsWithSuccess:(void(^)(NSArray *subscriptions))success
                                failure:(void(^)(NSError *error))error {

    NSLog(@"%s", __PRETTY_FUNCTION__);

//    self.youTube.authorizer = self.googleAuth; // If uncommented, works!

    GTLQueryYouTube *query = [GTLQueryYouTube queryForSubscriptionsListWithPart:@"snippet"];
    query.mine = YES;

    [self.youTube
     executeQuery:query
     completionHandler:^(GTLServiceTicket *ticket,
                         GTLYouTubeChannelListResponse *channelList,
                         NSError *error) {

        if (error != nil) {
            NSLog(@"%s %@", __PRETTY_FUNCTION__, error.localizedDescription); // fails here
            return;
        }

        for (GTLYouTubeSubscription *channel in channelList) {
            NSLog(@"%@", channel.snippet.title);
        }
     }];
}

1 ответ

Я не мог найти прямое решение, но вы можете сделать это:

Получить токен доступа от GTMOAuth2Authentication объект через:

auth.accessToken

Затем установите токен доступа там, где вы хотите делать запросы. Чтобы обновить токен, используйте этот метод:

[auth 
 authorizeRequest:nil // just to refresh
 completionHandler:^(NSError *error) {
     // your code here
 }];
Другие вопросы по тегам