Google Objective C api: завершение Handler никогда не вызывается, когда нет подключения к интернету

iOS новичок, я пытаюсь загрузить видео на YouTube, используя Google Цель C API. В большинстве случаев это просто работает. Видео может быть загружено, и мой обратный вызов получает ошибки, если они происходят.

Но если я отключаю интернет-соединение на устройстве, обратный вызов никогда не вызывается. (даже если он вызывается для других типов ошибок, таких как неправильный заголовок или неправильные теги)

Мое личное предположение, что, хотя я установил обратный вызов для GTLServiceYouTube, я явно не установил обратный вызов для GTMOAuth2Authentication, отсюда и отсутствие вызова. Но я не уверен, как установить один и ничего не нашел об этом нигде.

Обратите внимание, что в моей ситуации мне действительно нужно, чтобы мои пользователи могли загружать видео без необходимости вводить свои учетные данные, следовательно, инициализация GTMOAuth2Authentication вручную.

Вот мой код, скажите, пожалуйста, что я делаю что-то не так и как я могу это исправить.

    NSString *clientID = @"185815387242-hqo2d4e06j4hk4f02t5gvn7jcifakdvr.apps.googleusercontent.com";
    NSString *clientSecret = @"2LKi7orHyphJXXXXXXXXXXXX";
    NSURL *tokenURL = [NSURL URLWithString:@"https://accounts.google.com/o/oauth2/token"];
    NSString *redirectURI = @"urn:ietf:wg:oauth:2.0:oob";


    GTMOAuth2Authentication *auth;
    auth = [GTMOAuth2Authentication authenticationWithServiceProvider:kGTMOAuth2ServiceProviderGoogle
                                      tokenURL:tokenURL
                                      redirectURI:redirectURI
                                      clientID:clientID
                                      clientSecret:clientSecret];


    [auth setKeysForResponseString:@"email=annonce-video-i-6620%40pages.plusgoogle.com&isVerified=1&refresh_token=1%2FFFo5rlNs51u9g2TpCIE2oji_ACvDPc0XXXXXXXXXXXX&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email&serviceProvider=Google&userID=107586507912247324352"];
    //////////////////////////////////////////////////

    GTLServiceYouTube *youTubeService = [[GTLServiceYouTube alloc] init];

    // Have the service object set tickets to fetch consecutive pages
    // of the feed so we do not need to manually fetch them.
    youTubeService.shouldFetchNextPages = YES;

    // Have the service object set tickets to retry temporary error conditions
    // automatically.
    youTubeService.retryEnabled = YES;

    youTubeService.authorizer = auth;

    // Status.
    GTLYouTubeVideoStatus *status = [GTLYouTubeVideoStatus object];

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

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

    // Get a file handle for the upload data.
    NSString *path = @"AVALIDPATH";
    NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:path];
    if (fileHandle) {
        NSString *mimeType = @"video/mp4";
        GTLUploadParameters *uploadParameters =
        [GTLUploadParameters uploadParametersWithFileHandle:fileHandle
                                                   MIMEType:mimeType];
        uploadParameters.uploadLocationURL = nil;

        GTLQueryYouTube *query = [GTLQueryYouTube queryForVideosInsertWithObject:video
                                                                            part:@"snippet,status"
                                                                uploadParameters:uploadParameters];




        GTLServiceYouTube *service = youTubeService;
        [service executeQuery:query
                 completionHandler:^(GTLServiceTicket *ticket,
                                  GTLYouTubeVideo *uploadedVideo,
                                  NSError *error) {
                       //NEVER CALLED WHEN THE DEVICE IS IN AIRPLANE MODE
                       NSLog(@"And call me maybe.");
                                                  }];

Я отследил отсутствие вызова на линию 969 GTMHTTPFetcher

  @synchronized(self) {
    target = [[delegate_ retain] autorelease];
    sel = finishedSel_;
#if NS_BLOCKS_AVAILABLE
    block = [[completionBlock_ retain] autorelease];
#endif
  }

Синхронизированный блок вызывается дважды: один раз для вызова обратного вызова GTMOAuth2Authentication, а второй - для вызова... Ну... ноль

1 ответ

Решение

Ошибка в обработке повторов при загрузке была недавно исправлена в библиотеке. Попробуйте обновить исходные коды библиотеки Google API.

Другие вопросы по тегам