Was ist die richtige Methode zur GameCenter-Authentifizierung?

Ich habe in Beiträgen einen Stapelüberlauf gesehen, der Ausschnitte aus der GameCenter-Authentifizierung zeigt. Keine dieser Lösungen befasst sich jedoch mit einem der Probleme, die Anwendungsfälle in der Praxis abdecken. Der [GKLocalPlayer localPlayer] .authenticateHandler ist nämlich nur ein Rückruf des Status und sonst nicht viel. Es bietet einen Ansichts-Controller, aber es gibt massive Inkonsistenzen in den Status ".authenticated" und "error states".

Es gibt einige Dinge, die ich versuche zu tun: 1. Öffnen Sie die Game Center-Anmeldung erst, wenn eine Funktion sie verwendet. 2. Versuchen Sie, sich beim Start der App unbemerkt zu authentifizieren Bereitstellen eines Wiederherstellungsmechanismus

Namely, wenn ein Fehler gemeldet wird, wie kann ich den Anmeldedialog trotzdem anzeigen?

Ich erhalte diesen Fehler ohne viewController:

Fall 1

Error in GameCenterManager :: authenticateLocalPlayer [Die Internetverbindung scheint offline zu sein.]

rotz der Fehlermeldung ist das Gerät vollständig online, da Safari cnn.com in Ordnung lädt.

Fall 2:

Someone schließt den Anmeldebildschirm, weil sie nicht bereit sind. In diesem Fall wird .authenticated als true zurückgegeben, viewController bleibt auf nil, aber alle Aufrufe von Game Center schlagen fehl. Warum wird die Datei [GKLocalPlayer localPlayer] .authenticated auf true gesetzt, wenn dies nicht der Fall ist?

Fall 3:

Error in GameCenterManager :: authenticateLocalPlayer [Der Vorgang konnte nicht abgeschlossen werden. (NSURLErrorDomain-Fehler -1009.)]

Dies tritt weiterhin auf, aber die App kann nichts für den Benutzer tun. In diesem Fall, wie sollte die Nachricht lauten? Apps ins Game Center wechseln und dort einloggen?

Fall 4:

Error in GameCenterManager :: authenticateLocalPlayer [Der angeforderte Vorgang wurde vom Benutzer abgebrochen oder deaktiviert.]

Dies geschieht, wenn der Benutzer den viewController abbricht, zu dessen Präsentation die App von apple aufgefordert wurde. Es gibt jedoch auch keine Wiederherstellung oder Erkennung dieses Zustands.

Fall 5:

Error in GameCenterManager :: createMatch [Der angeforderte Vorgang konnte nicht abgeschlossen werden, da der lokale Spieler nicht authentifiziert wurde.]

Dies geschieht, wenn der Benutzer angemeldet war, sich jedoch aus irgendeinem Grund von GameCenter abmeldet und dann zur App zurückkehrt. Der App wird mitgeteilt, dass der Benutzer noch authentifiziert ist, wenn dies eindeutig nicht der Fall ist. Ich kann jedoch keine Anrufe tätigen, um ein anderes Login aufzurufen.

So im Wesentlichen, wenn GameCenter nicht nur im Hintergrund funktioniert, was müssen wir als App-Designer tun? Benachrichtigungsansicht und Aufforderung, sich über die Game Center-App anzumelden und die App neu zu starten?

Hier ist mein Authentifizierungscode:

//******************************************************
// Authenticate
//******************************************************
-(void)authenticateLocalPlayer:(bool)showLogin
{
    if( showLogin && self.loginScreen != nil )
    { [[WordlingsViewController instance] presentViewController:self.loginScreen animated:YES completion:nil]; }

    if( [GKLocalPlayer localPlayer].isAuthenticated )
    {
        NSDLog(NSDLOG_GAME_CENTER,@"GameCenterManager::authenticateLocalPlayer LocalPlayer authenticated");
    }
    __weak GameCenterManager* weakSelf = self;
    [GKLocalPlayer localPlayer].authenticateHandler = ^(UIViewController *viewController, NSError *error)
    {
        if (error != nil)
        {
            NSDLog(NSDLOG_GAME_CENTER,@"Error in GameCenterManager::authenticateLocalPlayer [%@]", [error localizedDescription]);
        }
        else
        {
            if (viewController != nil)
            {
                NSDLog(NSDLOG_GAME_CENTER,@"GameCenter: No authentication error, but we need to login");
                weakSelf.loginScreen = viewController;
            }
            else
            {
                if ( [GKLocalPlayer localPlayer].authenticated )
                {
                    NSDLog(NSDLOG_GAME_CENTER,@"GameCenter localPlayer authenticated");
                    weakSelf.gameCenterAvailable = YES;
                    weakSelf.localPlayer = [GKLocalPlayer localPlayer];
                    [weakSelf retrieveFriends];
                    [weakSelf loadPlayerPhoto:weakSelf.localPlayer];

                    for ( id<GameCenterDelegate> listener in weakSelf.listeners )
                    { [listener onPlayerAuthenticated]; }
                }
                else
                {
                    weakSelf.gameCenterAvailable = NO;
                }
            }
        }
    };
}

Diese Funktion wird zweimal aufgerufen: einmal beim Start der App, um hoffentlich einen gültigen Anmeldestatus zu erstellen, und einmal, wenn der Benutzer nicht authentifiziert ist und versucht, eine App-Funktion zu verwenden, für die Game Center erforderlich ist. In dieser App erstellt es ein rundenbasiertes Match oder zeigt Freunde an

Antworten auf die Frage(2)

Ihre Antwort auf die Frage