Иногда обработчик аутентификации Game Center никогда не вызывается
В нашей игре для iOS мы используем Game Center для идентификации игроков и синхронизации их данных между устройствами с использованием наших собственных серверов. Поскольку Game Center идентифицирует игроков, нам нужно знать, аутентифицированы ли они, изменили ли они аутентификацию и т. Д. У нас есть титульный экран, который отображает "Инициализация Game Center..." до тех пор, пока не будет выполнен вызов аутентификации, и только один раз. мы знаем, кого они аутентифицировали, так как (если кто-нибудь) мы идем в игру.
Однако, очень небольшое количество времени (фактически я не могу воспроизвести это сам), обработчик аутентификации никогда не вызывается, никогда. Даже после минут ожидания. Приветственный баннер Game Center также никогда не отображается, так что дело не в том, что наш обработчик никогда не вызывается, но, похоже, в действительности нет статуса аутентификации.
До сих пор мы реализовали 30-секундный тайм-аут, при котором, если мы ничего не слышим от Game Center, мы предполагаем, что статус аутентификации не изменился, и мы используем ваши сохраненные данные. Этот 30-секундный тайм-аут не идеален, поэтому мне интересно, есть ли какая-то рифма или причина, когда GC не отвечает.
Вот код, который вызывается из нашего делегата приложения application: didFinishLaunchingWithOptions:
метод:
PlayerModel *playerModel = [PlayerModel sharedPlayerModel];
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
if ([localPlayer respondsToSelector:@selector(setAuthenticateHandler:)])
{
localPlayer.authenticateHandler = ^(UIViewController *gkViewController, NSError *error)
{
if (localPlayer.authenticated)
{
[playerModel loadFromGameCenter];
playerModel.hasGCStatus = TRUE;
[playerModel sync];
}
else if (gkViewController)
{
[viewController presentViewController:gkViewController animated:TRUE completion:nil];
}
else
{
NSLog(@"Could not authenticate with Game Center");
[playerModel unloadFromGameCenter];
playerModel.hasGCStatus = TRUE;
[playerModel sync];
}
};
}
else
{
[localPlayer authenticateWithCompletionHandler:^(NSError *error) {
if (localPlayer.authenticated)
{
[playerModel loadFromGameCenter];
playerModel.hasGCStatus = TRUE;
[playerModel sync];
}
else
{
NSLog(@"Could not authenticate with Game Center");
[playerModel unloadFromGameCenter];
playerModel.hasGCStatus = TRUE;
[playerModel sync];
}
}];
}
3 ответа
У меня был такой опыт во время тестирования в одной из наших игр на сервере с песочницей, иногда действительно не было никакого вызова уведомлений или вызова обработчика аутентификации, тогда он просто работал бы через полчаса.
Мы предположили, что это произошло из-за серверной части Apple, поскольку мы никогда не сталкивались с этой проблемой за пределами песочницы Game Center.
Извините, что объяснение немного расплывчато и нет ничего конкретного, что вы можете сделать. Но это не твой код. Это конец, который вы не можете контролировать.
Попробуйте послушать GKPlayerAuthenticationDidChangeNotificationName
который должен уведомить после аутентификации. По крайней мере, это может означать отсутствие сообщения.
Возможно, проблема в серверах Apple. Вы можете устранить это, запустив трассировку Wireshark от сетевого прокси, который использует ваш iPhone. Если это видно только с телефонов других людей, то, возможно, зарегистрируйте сетевое подключение и достижимость, которую они испытывают, чтобы сопоставить, если виноваты определенные сетевые события на их конце.
Также стоит занести NSErrors
как часть вашего кода в случае, если он пытается сказать вам что-то, что упускается из виду.
Мы столкнулись с той же проблемой, которая возникла у некоторых людей только по Wi-Fi. Оказывается, для работы GameCenter требуется нелепое количество разрешений брандмауэра: https://support.apple.com/en-us/HT202944 Мы считаем, что проблема заключается в том, что некоторые сети блокируют эти порты, что приводит к тому, что вызов никогда не отвечает.