2016-07-11 3 views
1

Действительно ли a, даже в случае ошибки аутентификации?Является ли localPlayer еще аутентифицированным, даже если аутентификация завершается ошибкой

GKLocalPlayer.localPlayer.authenticateHandler = 
    ^(UIViewController *viewController, NSError *error) 
{ 
    if (error) 
    { 
    bool a = GKLocalPlayer.localPlayer.authenticated; 
    } 
    else 
    { 

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

Я нахожу руководство немного неоднозначным. От https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/GameKit_Guide/Users/Users.html#//apple_ref/doc/uid/TP40008304-CH8-SW11:.

«Как только ваша игра переходит на задний план, значение аутентифицированного собственности локального объекта игрока становится и остается недействительным, пока ваша игра не возвращается на первый план Вы не можете прочитать значение, если определить игрок по-прежнему проверяется до тех пор, пока Game Kit не повторит аутентификацию игрока и не вызовет обработчик проверки подлинности. Ваша игра должна действовать так, как если бы не был аутентифицированный игрок до тех пор, пока не будет вызван обработчик завершения. После вызова обработчика значение, сохраненное в аутентифицированном свойстве, еще раз."

Действительно ли значение действует, даже если аутентификация не удалась?

ответ

1

У меня есть долговременная ошибка с Apple. Он был закрыт и снова открыт во время текущего диалога. Вопрос о том, действительно ли действителен .authenticated, зависит от вашей перспективы

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

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

Мне кажется, что Apple не любит, когда игроки видят проблему, связанную с их инфраструктурой. Таким образом, с помощью этого механизма вы пытаетесь продвигаться вперед, фальсифицируя состояние, надеясь, что проблема будет работать позже. В моих играх эта стратегия никогда не выкладывается и в итоге достигает неустранимой ситуации после того, как пользователи вложили время/силы в игру. Итак, как и ваш код выше, я полагаюсь на то, что говорит NSError. Если указано «ошибка», я обрабатываю плеер как неаутентифицированный, предоставляя подсказки пользовательского интерфейса для исправления ситуации.

Я документировано более подробную информацию о моем подходе здесь: https://stackoverflow.com/a/37216566/1641444

+0

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

+0

Справедливая точка. Моя проблема заключается в том, что она уже знает, что она не может подключиться, например, в режиме «Самолет», но все еще сообщает об аутентификации. Или сообщать о кешированных результатах * без * говорящего мне. Я предложил в своей ошибке сделать это 3-значным значением: аутентифицированным, неавторизованным и кэшированным. Тогда я полностью пойму состояние, в котором я нахожусь, и могу выбрать, как действовать дальше. Это, наверное, спорный вопрос. Я серьезно сомневаюсь, что они что-то изменят. – Thunk

Смежные вопросы