Предупреждение входа в систему GameCenter

В игре, которую я разрабатываю с использованием GameCenter, я хочу обработать следующий сценарий:

  • пользователь запускает игру. Ему показывают системное предупреждение, в котором ему предлагается войти в GameCenter. На данный момент он игнорирует это.
  • через некоторое время пользователь хочет войти в GameCenter и нажимает (например) элемент меню Leaderboards. На данный момент он отменяет отмену вместо входа в систему.
  • процесс повторяется несколько раз. В конце концов пользователь хочет войти в GameCenter. Он еще раз нажимает элемент меню Leaderboard.

В моих тестах я обнаружил, что всплывающее окно предупреждения, вызванное вызовом "authenticateWithCompletionHandler" (как вызвано образцом Apple GameCenterManager), который предлагает войти в GameCenter, появляется только ограниченное количество раз (4 или 5). В последний раз, когда он появляется, в нем говорится: "Game Center Disabled", войдите в приложение Game Center, чтобы включить "Afterwards". После этого вызов authenticateWithCompletionHandler больше не делает ничего видимого - вообще не запрашивайте.

Играя в FruitNinja, я попытался воспроизвести это. Однако в их случае всплывающее сообщение "Game Center Disabled" появляется каждый раз, когда я нажимаю элемент GameCenter (например, достижения).

То, что я хотел бы сделать, - дублировать функциональность, то есть, если вы не вошли в GameCenter, чтобы стандартное предупреждение о игровом центре появлялось все время, когда вы нажимаете элемент меню Leaderboard.

Есть ли способ узнать, появилось ли стандартное оповещение "войти в игровой центр" или заставить его появляться всегда (а не только первые две попытки)?

Ответ 1

Поведение - это то, что после N неудачных попыток - отключить GameCenter для приложения. Перезапуск приложения или вход в систему gamecenter приведет его обратно.

Я забыл, какой документ я прочитал, но там есть документ Apple, объясняющий это поведение.

Ответ 2

Здесь есть идея обходной проблемы:

Независимо от того, отменен ли "GC authenticateWithCompletionHandler" -Request

  • нажав кнопку "Отмена" в диалоговом окне

или из-за того, что

  • GC отключен на устройстве (что происходит после того, как пользователь отменил диалог оповещения ровно 3 раза (по крайней мере, в iOS 5))

вы всегда будете получать NSError с кодом 2, говорящим: "Запрошенная операция была отменена".

Единственным отличием, который я смог найти, является время, прошедшее между аутентификаторомWithCompletionHandler-Request и выполнением обработчика завершения.

Поэтому при отправке запроса я сохраняю время:

requestTime = [NSDate date]; 

а в моем обработчике завершения я измеряется время, прошедшее:

NSDate* now = [NSDate date];
CFTimeInterval elapsedTimeSinceAuthenticationRequest = [now timeIntervalSinceDate:requestTime];
NSLog(@"time Elapsed: %f", elapsedTimeSinceAuthenticationRequest);

Если пользователь отменил запрос, пройденное время будет значительно больше по сравнению с временем, прошедшим, если GC отменит операцию. В моих тестах пользователю потребовалось не менее одной секунды, чтобы отменить диалог, тогда как запрос с отменой GC занял менее 0,1 секунды (на моем iPhone 4).

Конечно, эти значения могут различаться в зависимости от устройства, на котором работает код, и от того, что еще занят процессор на данный момент. Одна ошибка, которую я уже рассмотрел, - это запуск приложения. Если вы отправляете идентификатор проверки подлинности во время applicationDidFinishLaunching, как было предложено Apple, потребовалось намного больше времени, чтобы GC отменил запрос в моем случае, поскольку устройство занято загрузкой просмотров и тем, что необходимо для запуска приложение.

Итак, дайте мне знать, если вы попробовали это решение, и если бы это сработало для вас, как и после того, как я продолжу тестирование...

Ответ 3

Я тоже не мог найти хороший ответ, поэтому решил только размножить сообщение, как только начну получать ошибку отмены. Это все еще находится в разработке, но в основном это изменяет обратный вызов кнопки, чтобы отображать предупреждение об ошибке, а не отображать панель лидеров.

Просто заметьте, не уверен, что это будет одобрено или нет, поскольку я копирую сообщение об ошибке Apple.

-(void) gcLogin: (id) sender {
    [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:^(NSError *error) {
        if(error) {
            if([[error domain] isEqualToString:GKErrorDomain] && [error code] == GKErrorCancelled) {
                [ResourceManager showAlertWithTitle:@"GameCenter Disabled" message:@"Sign in with Game Center application to enable"];
                mGameCenterCancelled = YES;
            }
            NSLog(@"%@", [error description]);
        } else { 
            [self updateMenu];
            mGameCenterCancelled = NO;
        }
    }];
}

Ответ 4

Я играю в Game Center прямо сейчас, я видел такое же поведение. В документации ничего не говорится о диалоге, показывающем только первые пару раз. В моем случае я хотел бы рассказать заранее, если пользователь уже зарегистрирован в Game Center, чтобы я мог вести себя соответствующим образом. Но теперь я не могу знать этого, прежде чем диалог будет показан пользователю.

Поскольку мы работаем в песочнице во время разработки, это поведение, конечно, может быть чем-то, что ведет себя по-разному во время производства, но это нелегко узнать.

Ответ 6

У меня такая же проблема. Хотя я не мог найти способ принудительно ввести тот же диалог для входа в Game Center, я нашел способ реализовать предупреждающее сообщение о том, что "gamecenter отключен", когда пользователь нажимает значок значка:

if ([GKLocalPlayer localPlayer].authenticated == NO)
{
   // Запросить предупреждение, предупреждающее о том, что игровой центр отключен
}
остальное
{
  // Продолжить открытие таблицы лидеров
}

Надеюсь, это поможет!

Ответ 7

Похоже, что iOS полностью отключит Game Center и не даст ему запросить после того, как пользователь решит отключить Game Center (опция появится на пятом пятом знаке отмены Game Center).

Чтобы восстановить устройство в исходное состояние, в котором снова появится запрос на вход. Просто войдите в приложение Game Center, используя обычную рабочую учетную запись Game Center (не тестер). Как только вы войдете в систему, выйдите из системы. Он должен начать запрашивать вас снова в вашем приложении.