Уведомление о входе в GameCenter - PullRequest
11 голосов
/ 30 ноября 2010

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

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

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

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

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

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

Ответы [ 7 ]

8 голосов
/ 16 января 2012

Вот идея обойти эту проблему:

Независимо от того, отменен ли запрос "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 потребовалось гораздо больше времени, чтобы отменить запрос в моем случае, потому что устройство занято загрузкой представлений и всего, что необходимо для запуска приложение.

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

3 голосов
/ 02 мая 2012

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

Просто примечание, не уверен, будет ли это одобрено или нет, поскольку я реплицирую сообщение об ошибке 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;
        }
    }];
}
3 голосов
/ 30 января 2011

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

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

1 голос
/ 04 декабря 2010

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

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

0 голосов
/ 26 июня 2013

Похоже, что iOS полностью отключит Game Center и не выдаст подсказки после того, как пользователь выберет Disable Game Center (эта опция появится при пятом входе в 5-й игровой центр).перевести устройство в исходное состояние, где снова появится приглашение для входа.Просто войдите в систему с помощью приложения Game Center, используя обычную рабочую учетную запись Game Center (не Tester).Как только вы вошли, выйдите.Он должен начать снова запрашивать вас в вашем приложении.

0 голосов
/ 27 июля 2012

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

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

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

0 голосов
/ 02 февраля 2012

Может быть, будет полезна ссылка (первые три абзаца): http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/GameKit_Guide/Users/Users.html#//apple_ref/doc/uid/TP40008304-CH8-SW9

Основная точка в прямоугольнике «Важно».

...