Game Center / GameKit повторно отправляет результаты, когда сеть доступна

Я создаю игру, как приложение, которое поддерживает Game Center. И у меня есть проблема с отчетом о счете в таблице лидеров, когда игрок правильно аутентифицирован в GC, но сеть (wi-fi и сотовая связь) недоступна в то время, когда я хочу сообщить о своем счете.

Мое приложение предназначено для iOS 5.0 и более поздних версий, и, согласно документации, оно должно повторно отправлять результаты, когда сеть становится доступной. Позвольте мне объяснить, что я пытался:

  • Я открыл свое приложение и аутентифицировал свою учетную запись GC, выключил Wi-Fi, сообщил счет, затем открыл Wi-Fi и подождал 30 минут. После этого я проверил таблицу лидеров, но в моей таблице лидеров нет обновленных результатов. (Может быть, я нетерпелив, и это из-за неопределенного времени/интервала, когда яблоко решает повторно отправить оценки?)

  • Я открыл свое приложение и аутентифицировал свою учетную запись GC, закрыл приложение, выключил Wi-Fi, снова открыл свое приложение, оно автоматически аутентифицирует мою учетную запись GC, я сообщил о счете, затем открыл Wi-Fi, и все еще не обновил счет в своих списках лидеров. (Может быть, я нетерпелив, и это из-за неопределенного времени/интервала, когда яблоко решает повторно отправить оценки?)

Если эта повторная отправка занимает более 30 минут, я думаю, что это так бесполезно? Есть ли способ преодолеть это? Я имею в виду, что если я сохраню и отправлю оценки позже, это тоже будет плохо, потому что GC тоже отправит их позже? (Это будет не так уж плохо, но все же это было бы ненужно)

Есть ли какая-либо документация об этом времени повторной отправки? Я ничего не нашел... Я имею в виду, когда он будет повторно представлен? Нужно ли мне держать мое приложение и мой Wi-Fi открытым, пока оно не будет отправлено повторно?

Спасибо за ваши ответы ...


person Sezertt    schedule 17.01.2013    source источник
comment
Я борюсь с тем же. Вы когда-нибудь находили решение или какие-либо дополнительные сведения об этой проблеме? Мое подозрение — или, скорее, моя надежда — заключается в том, что автоматическая синхронизация с промежуточным хранением, которая должна быть доступна в iOS 6.0 и более поздних версиях, на самом деле не работает для приложений, которые не работают и используют тестовые учетные записи песочницы. Моя проблема с ручной синхронизацией, когда я обнаруживаю, что сетевое соединение было восстановлено, заключается в том, что оценка будет отправлена ​​​​с текущей отметкой времени, а не исторической отметкой времени оценки.   -  person jay492355    schedule 06.09.2013


Ответы (1)


Неважно, включен или выключен Wi-Fi, если у вас также есть сотовая связь. Код GC будет использовать любой доступный доступ к сети. Если ни один из них недоступен, когда вы вызываете «reportScoreWithCompletionHandler:^(NSError *error)», он сообщит об оценке в следующий раз, когда сеть станет доступной.

Вы не сказали, работал ли когда-нибудь ваш код. Распространенной ошибкой является то, что идентификатор таблицы лидеров в вашем коде не совсем совпадает с идентификатором таблицы лидеров в iTunesConnect. Если они не совпадают, счет никогда не будет успешно сообщен, но он не скажет вам, в чем проблема.

Также обратите внимание, что счет должен быть 64-битным значением. Возможно, вы сообщаете 32-битное значение.

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

Вы проверяете код ошибки? Если «ошибка», которую вы возвращаете из «reportScoreWithCompletionHandler: ^ (NSError * error)», не равна NULL, значит, что-то не так с вашим кодом. Его значение может быть бесполезным (если оно не равно NULL), но, по крайней мере, вы знаете, что что-то не сработало.

По моему опыту, в режиме песочницы списки лидеров обычно обновляются довольно быстро (менее минуты), но не мгновенно. Но в некоторые дни что-то не так с сервером, и обновление занимает несколько часов или вообще не работает. Я читал, что производственный сервер GC более надежен и обновляется быстрее, чем сервер-песочница.

Для чего это может стоить вот код, который я использовал для отчета о баллах. Кажется, это работает:

-(void) submitScore:(int64_t)score category:(NSString *)leaderboardIdentifier {
    if (!!! [GKLocalPlayer localPlayer].authenticated ) {
        CCLOG(@"GKLocalPlayer is not authenticated");
        return;
    }

    GKScore *gkScore = [[[GKScore alloc] initWithCategory:leaderboardIdentifier] autorelease];
    gkScore.value = score;
    [gkScore reportScoreWithCompletionHandler:^(NSError *error) {
        [self setLastError:error];
    }];
}
person RobertL    schedule 18.01.2013
comment
Я использую почти тот же код, что и вы. Извините, я не упомянул, что успешно разместил много результатов в своих списках лидеров, но это работает нормально, только когда у меня есть сеть. Так и должно быть, а не иначе я ошибся :) - person Sezertt; 19.01.2013
comment
Где я написал (wifi или сотовая связь). Но я не спрашиваю ничего из этого, мне действительно нужно знать только эту функцию повторной отправки, которую Game Center обрабатывает для нас, когда сеть недоступна ... - person Sezertt; 19.01.2013
comment
Кстати, когда я пытаюсь сообщить о счете, когда нет доступного сетевого подключения, он не выдает ошибки, он говорит, что успешно сообщил о счете... - person Sezertt; 19.01.2013
comment
Да, это так. Я предполагаю, что это означает, что отчет был успешно поставлен в очередь на передачу, когда сеть доступна. - person RobertL; 19.01.2013
comment
Но я ждал уже 2 дня, а обновленного счета нет... Я успешно вошел в систему и отправил еще один результат в другую таблицу лидеров, но офлайн-счета еще не отправлены... - person Sezertt; 19.01.2013
comment
Насколько я могу судить, функция повторной отправки или повторной попытки работает так, как вы ожидаете. Может быть, есть какая-то ситуация, когда это не работает, но я этого еще не видел. Кстати, тот факт, что локальный игрок аутентифицирован, не доказывает, что сеть доступна. - person RobertL; 19.01.2013
comment
Я попробую свое приложение с включенным режимом полета, а затем выключу его после того, как отправлю оценку и опубликую еще один комментарий о том, что произошло. - person RobertL; 19.01.2013
comment
Я вижу, что моя оценка не отображается до тех пор, пока приложение не будет запущено снова, когда режим полета выключен, но тогда она будет отображаться правильно. Мое приложение не работало в фоновом режиме во время этого теста. Если он работал в фоновом режиме, когда режим полета выключен, он может сообщать о счете. Мне не слишком удобно проверять такую ​​возможность. Этот веб-сайт может заблокировать дальнейшие комментарии, потому что считает обсуждение плохим. - person RobertL; 19.01.2013
comment
Как я уже говорил ранее, когда я пытаюсь отправить счет в режиме полета, он не возвращает никаких ошибок, и эта ситуация также блокирует меня для повторной отправки его позже вручную, потому что я не могу знать незарегистрированные баллы. Я не понял, что вы имеете в виду под функцией повторной отправки или повторной попытки, которая работает так, как вы ожидаете. Он никогда не пытается повторно отправить счет, когда сеть доступна. Надеюсь, вы найдете для меня ответ. Кстати, спасибо, что потратили время на мою проблему... - person Sezertt; 19.01.2013
comment
Вы используете песочницу GameCenter или ваше приложение работает? Я использую тот же код, который вы написали в своем ответе, но мой никогда не пытается отправить его, когда сеть доступна, поэтому я подумал, что, возможно, это из-за песочницы... - person Sezertt; 19.01.2013
comment
Я долго искал это в Интернете и не смог решить проблему... Также я видел некоторых других, страдающих от такой же ситуации [ссылка] (simx.me/technonova/software_development/), поэтому я проверил наличие соединения в своем приложении, и если его нет, я сохранил результаты для отправки, когда соединение будет доступно. .. Я также отправил отчет об ошибке в Apple. Я надеюсь, что это будет исправлено для других... - person Sezertt; 21.01.2013