API Google Reader: pushViewController и NSURLErrorDomain Code = -1012 против presentModalViewController и успеха - PullRequest
0 голосов
/ 17 февраля 2011

Наше приложение для iPad использует UINavigationController в UIPopoverController.
Второе представление, управляемое контроллером навигации, является подклассом UITableViewController, который, когда выбран правильный ряд, выдвигает GDataOAuthViewControllerTouch, как описано на http://code.google.com/p/gdata-objectivec-client/wiki/OAuthSignInControllers:

GDataOAuthViewControllerTouch *googleOAuthViewController =
[[GDataOAuthViewControllerTouch alloc] initWithScope:@"http://www.google.com/reader/api/*"
                                            language:nil
                                      appServiceName:kAppServiceName
                                            delegate:self
                                    finishedSelector:@selector(viewController:finishedWithAuth:error:)];

googleOAuthViewController.contentSizeForViewInPopover = CGSizeMake(400.0, 577.0);
googleOAuthViewController.navigationItem.title = @"Google Account";

[self.navigationController pushViewController:googleOAuthViewController animated:YES];
[googleOAuthViewController release];

Законченный метод вызывается с успехом:

- (void)viewController:(GDataOAuthViewControllerTouch *)viewController
      finishedWithAuth:(GDataOAuthAuthentication *)auth
                 error:(NSError *)error {
    // error == nil
}

Тем не менее, когда приложение затем пытается получить список подписки, запрос как-то отменяется:

Error Domain=NSURLErrorDomain Code=-1012 "The operation couldn\u2019t be completed.

Код -1012: kCFURLErrorUserCancelledAuthentication = -1012 (определено в CFNetworkErrors.h).

Когда вместо googleOAuthViewController представлен модальный контроллер:

[self presentModalViewController:googleOAuthViewController animated:YES];

, тогда запрашиваемые данные извлекаются без проблем.

Непонятно, что вызывает отмену запроса при установке контроллера на навигационный контроллер и как это исправить.

1 Ответ

0 голосов
/ 23 февраля 2011

Наше приложение синхронно запрашивает список подписки пользователя у Google Reader.

Указанная проблема возникает, когда googleOAuthViewController находится в стеке UINavigationController и не является корневым контроллером. Код Google добавляет контроллер в методе popView в GDataOAuthViewControllerTouch.m (строки 361-375 в gdata -jectivec-client-1.11.0), когда это будет сделано. Каким-то образом вызов popViewControllerAnimated мешает выполнению запроса в обратном вызове (при успешной аутентификации):

- (void)viewController:(GDataOAuthViewControllerTouch *)viewController
      finishedWithAuth:(GDataOAuthAuthentication *)auth
                 error:(NSError *)error

Если строки с 367 по 370 в GDataOAuthViewControllerTouch.m закомментированы:

//      isPoppingSelf_ = YES;

//      [[self navigationController] popViewControllerAnimated:YES];
//      [[self view] setHidden:YES];

тогда запрос всегда завершается успешно. Затем в приложении должно появиться представление Google, ПОСЛЕ того, как запрос будет выполнен.

...