2012-09-25 5 views
6

Meine App speichert, ob sie erfolgreich mit Game Center authentifiziert wurde. Wenn ein neues Spiel gestartet wird oder wenn der Benutzer die Punkteliste betrachtet, wenn ein lokaler Spieler nicht erfolgreich authentifiziert wurde und die App gerade nicht versucht, einen Benutzer zu authentifizieren, versucht es erneut .GKLocalPlayer Auth-Absturz auf iOS6 mit Modal Transition Error

(Warum? Falls Sie von einer No-Netzwerk Zone zu einer Netzwerkzone bewegt haben.)

Leider unter iOS6/XCode 4.5, es beginnt abstürzt. Oder zumindest scheint es unter bestimmten eingeschränkten Umständen zu sein: wenn ein Benutzer sich mit einem falschen Passwort und/oder einem Konto, das nicht existiert, nicht anmeldet. Bei einer erfolgreichen Anmeldung ist alles in Ordnung.

Danach erfolglose Login, wenn ich gehe und etwas zu tun, dass eine reauth Check verursacht auftreten bekomme ich diese:

2012-09-25 15: 54: 47,829 APP NAMEN [1493: 907] * Assertionsfehler in - [UIWindowController Übergang: fromViewController: toViewController: Ziel: didEndSelector:], /SourceCache/UIKit/UIKit-2372/UIWindowController.m:211

diese dann tatsächlich stürzt:

2012-09-25 15: 55: 25,569 APP NAME [1493: 907] * Beenden app aufgrund abgefangene Ausnahme 'NSInternalInconsistencyException', Grund: ‚Der Versuch, einen Übergang von modalen < GKModalRootViewController zu beginnen : 0x1cd8b2a0 > bis < GKHostedAuthenticateViewController: 0x1e31a350 > während ein Übergang ist bereits in Bearbeitung. Warten Sie viewDidAppear/viewDidDisappear der aktuelle Übergang zu wissen, abgeschlossen‘ * ersten Wurf Call-Stack: (0x394932a3 0x31db297f 0x3949315d 0x383fd2af 0x3640377b 0x36402fcf 0x394969c4 0x393edfeb 0x36521733 0x32a83d2d 0x3264b11f 0x3264a4b7 0x3264f1bd 0x39466f3b 0x393d9ebd 0x393d9d49 0x353132eb 0x3636b301 0x7e863 0x7e808) libC++ abi .dylib: terminate genannt werfen eine Ausnahme

Dies ist der lästige Code:

-(void)authenticateLocalUser { 

    if (!self.checkingLocalPlayer) { 
     self.checkingLocalPlayer = YES; 
     GKLocalPlayer *thisPlayer = [GKLocalPlayer localPlayer]; 

     if (!thisPlayer.authenticated) { 

      [[GKLocalPlayer localPlayer] 
      authenticateWithCompletionHandler:^(NSError *error) 
      { 
       [self finishGameCenterAuthWithError:error]; 
      } 
      ]; 
     } 
    } 
} 

ein y Idee, was ich hier falsch mache?

Antwort

7

Ggrrrhhh das gleiche Problem, denke ich habe es gefunden ... ios6 veraltet authenticateWithCompletionHandler siehe Link, die vorschlagen, dass Sie AuthenticateHandler verwenden.

http://developer.apple.com/library/IOS/#documentation/GameKit/Reference/GKLocalPlayer_Ref/Reference/Reference.html#//apple_ref/occ/instp/GKLocalPlayer/authenticateHandler

Dies scheint ... richtig bemerkt

GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 
[localPlayer setAuthenticateHandler:(^(UIViewController* viewcontroller, NSError *error) { 

//[localPlayer authenticateWithCompletionHandler:^(NSError *error) { OLD CODE! 
    if (localPlayer.isAuthenticated) 
    { 
     //do some stuff 
    } 
    else { 

     UIAlertView *alertView = [[UIAlertView alloc] 
            initWithTitle:@"NOT AUTHORISED" 
            message:@"YOUR'RE NOT LOGGED INTO GC." 
            delegate:self 
            cancelButtonTitle:@"OK" 
            otherButtonTitles:nil]; 
     [alertView show]; 

    } 
})]; 
+0

Das war in der Tat das Problem. Ich habe ein paar zusätzliche Kommentare in der Nähe als eine andere Antwort. –

+0

Ja, danke für den Build auf dem ios 6 vs anderen. Ich glaube auch, dass presentModalViewController ist auch auf der Chop-Liste für iOS 6. –

3

Jamie Westen zu arbeiten, dass das Problem der Umstellung auf authenticateHandler in iOS6 war, die authenticateWithCompletionHandler verlassen zu haben scheint: gebrochen. Da es veraltet ist, wird Apple ihren Fehler wahrscheinlich nicht beheben.

Hier ist alles, was ich brauchte.Beachten Sie sowohl die bedingte Überprüfung der iOS5-Version (um sowohl 5 als auch 6 zu unterstützen) und die Notwendigkeit, einen View-Controller aufzurufen, wenn er gesendet wird (z. B. authenticateHandler: ist kein direkter Ersatz für authenticateWithCompletionHandler: - Sie müssen etwas mehr arbeiten).

-(void)authenticateLocalUser { 

    if (!self.checkingLocalPlayer) { 
     self.checkingLocalPlayer = YES; 
     GKLocalPlayer *thisPlayer = [GKLocalPlayer localPlayer]; 

     if (!thisPlayer.authenticated) { 

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) 

      if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0")) { 

       [thisPlayer setAuthenticateHandler:(^(UIViewController* viewcontroller, NSError *error) { 

        if (viewcontroller) { 
         [self.delegate presentViewController:viewcontroller]; 
        } else { 
         [self finishGameCenterAuthWithError:error]; 
        } 

       })]; 

      } else { 

       [[GKLocalPlayer localPlayer] 
       authenticateWithCompletionHandler:^(NSError *error) 
       { 
        [self finishGameCenterAuthWithError:error]; 
       } 
       ]; 
      } 

     } 
    } 
} 

Die presentViewController: Funktion ruft einfach den neuen View-Controller von meinen Top-View-Controller nach oben (was ich von Hand in meinem Programm herauszufinden, musste all diese Arbeit zu machen):

-(void)presentViewController:(UIViewController *)thisVC { 

    [myTopVC presentModalViewController:thisVC animated:YES]; 

} 

Leider Ab iOS6 sieht es so aus, als würde GameCenter nicht versuchen, einen Benutzer neu zu erstellen, wenn dieser bereits in der aktuellen Sitzung abgebrochen wurde. Daher ist zumindest ein Teil meiner Neuerung, falls zutreffend, verschwunden. Aber es ist immer noch für iOS5 (und vielleicht andere Situationen als das Abbrechen?).

Es wird versuchen, neu zu erstellen, wenn die App aus dem Ruhezustand aufgerufen wird, wenn ein Benutzer etwas anderes getan hat.

+0

Jeder Grund, dass Sie die iOS-Version überprüfen, anstatt nur zu überprüfen, ob die 'setAuthenticateHandler:' -Methode verfügbar ist? Ich frage mich, ob dies in iOS einfach undokumentiert sein könnte <6 ... – megastep

+0

schien mir nur klarer. –

+1

Nun, es sei denn, es ist absolut notwendig, empfiehlt Apple dringend, die Verfügbarkeit von Selektoren und Klassen zu überprüfen, anstatt nach bestimmten iOS-Versionen zu suchen. Sie können immer einen Kommentar in Ihrem Code hinzufügen, wenn Sie an den Grund erinnert werden möchten ... – megastep

1

Ich hatte genau das gleiche Problem und die ähnliche Absturzmeldung und die obigen Antworten haben das Problem nicht gelöst.

2012-09-25 15:55:25.569 APP NAME [1493:907] * Terminating app due to uncaught exception 
'NSInternalInconsistencyException', reason: 'Attempting to begin a modal transition from 
<GKModalRootViewController: 0x1cd8b2a0> to <GKHostedAuthenticateViewController: 0x1e31a350> 
while a transition is already in progress. Wait for viewDidAppear/viewDidDisappear to know 
the current transition has completed' 

Was ist eigentlich das Problem für mich verursacht war, dass ich genannt - (void) authenticateLocalPlayer aus - (void) viewDidLoad. Nachdem ich den Aufruf an - (void) viewDidAppear verschoben habe, wurde alles korrigiert, sogar mit der veralteten Methode des Aufrufs.()

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    //Setup Game Center Manager 
    if ([GameCenterManager isGameCenterAvailable]) { 
     delegate.gameCenterManager = [[GameCenterManager alloc] init]; 
     [delegate.gameCenterManager setDelegate:delegate]; 
     [delegate.gameCenterManager authenticateLocalUser]; 
    } else { 
     // The current device does not support Game Center. 
    } 

    //... more things if you have 
} 
+0

poste deinen Code marcwjj –

+0

Code veröffentlicht wie angefordert. – marcwjj