GKLocalPlayer.LocalPlayer null на некоторых симуляторах
У меня проблема с интеграцией Game Center с моей игрой Monogame.
Что я имею:
void InitGameCenter()
{
gameCenterManager = new GameCenterManager();
SetAuthenticateHandler();
}
void SetAuthenticateHandler()
{
GKLocalPlayer.LocalPlayer.AuthenticateHandler = (ui, error) => {
if (ui != null)
{
controller.PresentViewController(ui, true, null);
}
else if (GKLocalPlayer.LocalPlayer.Authenticated)
{
currentLeaderBoard = gameCenterManager.ReloadLeaderboard(leaderboardId);
}
else {
var alert = new UIAlertView("Game Center Account Required", "Need login the game center!", null, "Retry", null);
alert.Clicked += (sender, e) => {
//GKLocalPlayer.LocalPlayer.Authenticated();
};
alert.Show();
}
};
}
В некоторых симуляторах это останавливается на первой строке кода в методе SetAuthenticateHandler(), вызывая исключение, потому что GKLocalPlayer.LocalPlayer имеет значение null.
Где это работает:
Устройство iPad 2 (9.2). Каждый симулятор iPhone старше 5 (iPhone 5s, 6, 6s, независимо от версии iOS).
Где это не работает: каждый симулятор iPhone старше 5 лет (iPhone 5, 4s)
Методы, которые я вам показал, находятся в методе FinishedLaunching () AppDelegate, поскольку в Monogame нет ViewController.cs.
Есть какие-нибудь подсказки?
2 ответа
Может быть проблема подписи. Посмотрите на детали класса. Подпись меняется на iOS 6.
Из документов:
//
// This shows how to authenticate on both iOS 6.0 and older versions
//
if (UIDevice.CurrentDevice.CheckSystemVersion (6, 0)) {
//
// iOS 6.0 and newer
//
GKLocalPlayer.LocalPlayer.AuthenticateHandler = (ui, error) => {
// If ui is null, that means the user is already authenticated,
// for example, if the user used Game Center directly to log in
if (ui != null)
current.PresentModalViewController (ui, true);
else {
// Check if you are authenticated:
var authenticated = GKLocalPlayer.LocalPlayer.Authenticated;
}
Console.WriteLine ("Authentication result: {0}",err);
};
} else {
// Versions prior to iOS 6.0
GKLocalPlayer.LocalPlayer.Authenticate ((err) => {
Console.WriteLine ("Authentication result: {0}",err);
});
};
Итак, если кто-то захочет интегрировать Game Center с Monogame в будущем, для этого есть очень простое решение (встроенная в Monogame):
// Define gamer variable
SignedInGamer gamer;
// Launch Game Center authentication
gamer = new SignedInGamer();
// Later on, interact with Game Center in various ways
gamer.UpdateScore(category, score);
Guide.ShowLeaderboard();
Guide.ShowAchievements();
через picobots @ Форумы сообщества Monogame ( ссылка)