Вот идея обойти эту проблему:
Независимо от того, отменен ли запрос "GC authenticateWithCompletionHandler"
- пользователем, нажав «Отмена» в диалоговом окне
или из-за того, что
- GC отключен на устройстве (что происходит после того, как пользователь отменил диалоговое окно оповещения ровно 3 раза (по крайней мере в iOS 5))
вы всегда получите NSError с кодом 2, говорящим «Запрошенная операция была отменена».
Единственным отличием, которое я смог найти, является время, прошедшее между authenticateWithCompletionHandler-Request и выполнением Обработчика завершения.
Поэтому при отправке запроса я экономлю время:
requestTime = [NSDate date];
и в моем обработчике завершения я измеряю время:
NSDate* now = [NSDate date];
CFTimeInterval elapsedTimeSinceAuthenticationRequest = [now timeIntervalSinceDate:requestTime];
NSLog(@"time Elapsed: %f", elapsedTimeSinceAuthenticationRequest);
Если пользователь отменил запрос, прошедшее время будет значительно больше по сравнению с прошедшим, если GC отменил операцию. В моих тестах пользователю потребовалось не менее одной секунды, чтобы отменить диалоговое окно, тогда как запрос с отменой GC занял менее 0,1 секунды (на моем iPhone 4)
Конечно, эти значения могут варьироваться в зависимости от устройства, на котором выполняется код, и от того, чем еще процессор занят в данный момент. Одна ловушка, которую я уже рассмотрел, - это запуск приложения: если вы отправляете запрос authenticate во время applicationDidFinishLaunching, как это было предложено Apple, GC потребовалось гораздо больше времени, чтобы отменить запрос в моем случае, потому что устройство занято загрузкой представлений и всего, что необходимо для запуска приложение.
Итак, дайте мне знать, если вы попробовали это решение и сработало ли оно для вас, как я это сделаю, когда проведу дополнительное тестирование ...