Аутентификация Game Center может занять очень много времени.Как обойти это? - PullRequest
2 голосов
/ 20 февраля 2011

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

Но если вы не ждете аутентификации, возникают проблемы:

  • какВы возобновите сохраненную игру, если не знаете, кто является игроком?В идеале, сохраненная игра должна быть связана с тем, кто играл, чтобы у вас не было возобновления игры другого человека.

  • как возобновить игру после того, как приложение переключится обратно, если вы неВы не знаете, кто является игроком (возможно, игрок изменился с помощью приложения Game Center)?

  • предупреждение о входе в систему Game Center может появиться в середине активной игры (не ставится на паузу)

  • что если игра закончится до завершения аутентификации?Что если первоначальная аутентификация завершится после нескольких игр?Что, если начальная аутентификация завершается после переключения приложения или двух (что, в свою очередь, приводит к большему количеству аутентификаций)?

Каков разумный подход для решения этих проблем?

1 Ответ

1 голос
/ 21 февраля 2011

Хм .. Я аутентифицируюсь только в начале приложения. Он устанавливается вами, когда вы хотите аутентифицировать игрока. Возможно, вы захотите сохранить псевдоним игрока при первой аутентификации игрока. Значит:

sharedData.myName =  [[GKLocalPlayer localPlayer]alias];

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

Значение в вашей проверке часть GameCenter ..

if(!inGame)
{
  [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:^(NSError *error){
        if(error == nil){
  if(sharedData.myName ==nil)
  {
    sharedData.myName = [[GKLocalPlayer localPlayer]alias];
  }
  else if([[GKLocalPlayer localPlayer]alias] == sharedData.myName)
  {
    [self sendSavedData];
  }
  else if([[GKLocalPlayer localPlayer]alias] != sharedData.myName)
  {
    // create new data or look for other saved data which has the same name..
    // set sharedData.myName to current player Name..
  }
}

enter code here
...