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 ( ссылка)

Другие вопросы по тегам