Предупреждение входа в систему 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, чтобы я мог вести себя соответствующим образом. Но теперь я не могу знать этого, прежде чем диалог будет показан пользователю.
Поскольку мы работаем в песочнице во время разработки, это поведение, конечно, может быть чем-то, что ведет себя по-разному во время производства, но это нелегко узнать.
Ответ 5
Может быть, ссылка будет полезна (первые три абзаца):
http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/GameKit_Guide/Users/Users.html#//apple_ref/doc/uid/TP40008304-CH8-SW9
Главное в прямоугольнике "Важно".
Ответ 6
У меня такая же проблема. Хотя я не мог найти способ принудительно ввести тот же диалог для входа в Game Center, я нашел способ реализовать предупреждающее сообщение о том, что "gamecenter отключен", когда пользователь нажимает значок значка:
if ([GKLocalPlayer localPlayer].authenticated == NO)
{
// Запросить предупреждение, предупреждающее о том, что игровой центр отключен
}
остальное
{
// Продолжить открытие таблицы лидеров
}
Надеюсь, это поможет!
Ответ 7
Похоже, что iOS полностью отключит Game Center и не даст ему запросить после того, как пользователь решит отключить Game Center (опция появится на пятом пятом знаке отмены Game Center).
Чтобы восстановить устройство в исходное состояние, в котором снова появится запрос на вход. Просто войдите в приложение Game Center, используя обычную рабочую учетную запись Game Center (не тестер). Как только вы войдете в систему, выйдите из системы. Он должен начать запрашивать вас снова в вашем приложении.