iOS8 GKLocalPlayerInternal Unrecognized Selector

2019-08-30 10:49发布

问题:

Just installed ios8 on my device and am now receiving this error:

-[GKLocalPlayerInternal name]: unrecognized selector sent to instance 0x1b6e3f80

I do not see this error on two other devices with ios7 installed. On my device with ios8 installed I have already verified that GameCenter Sandbox is enabled by going to settings -> GameCenter -> Check "Sandbox"

I can avoid the error by commenting out this code below:

 // after checking that game center is available and authentication handler has not already been set, set the authentication handlers
[localPlayer setAuthenticateHandler:(^(UIViewController* viewController, NSError *error) {

    GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];

    if (!error && viewController)
    {
        [self showAuthenticationDialogWhenReasonable: viewController fromBaseViewController:baseController];
    }
    else if (localPlayer.isAuthenticated)
    {
        [self authenticatedPlayerandShowPopUpIfUnable:showPopUp];
    }
    else
    {
        [self disableGameCenterandShowPopUpIfUnable:showPopUp];
    }
})];

The stack trace reveals this:

  • thread #1: tid = 0x4011c, 0x3775ec64 libobjc.A.dylib`objc_exception_throw, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x3775ec64 libobjc.A.dylib`objc_exception_throw
frame #1: 0x2a0b6188 CoreFoundation`-[NSObject(NSObject) doesNotRecognizeSelector:] + 188
frame #2: 0x2a0b40a6 CoreFoundation`___forwarding___ + 714
frame #3: 0x29fe6208 CoreFoundation`_CF_forwarding_prep_0 + 24
frame #4: 0x2d3ff688 SpriteKit`-[SKNode isEqual:] + 164
frame #5: 0x2ad039fe Foundation`+[NSObject(NSDelayedPerforming) cancelPreviousPerformRequestsWithTarget:] + 358
frame #6: 0x30d9b872 GameCenterFoundation`-[GKPlayer postChangeNotification] + 38
frame #7: 0x30daed20 GameCenterFoundation`__52-[GKDaemonProxy setLocalPlayer:authenticated:reply:]_block_invoke + 848
frame #8: 0x0062faea libdispatch.dylib`_dispatch_call_block_and_release + 10
frame #9: 0x0062fad6 libdispatch.dylib`_dispatch_client_callout + 22
frame #10: 0x006334f6 libdispatch.dylib`_dispatch_main_queue_callback_4CF + 810
frame #11: 0x2a076be8 CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8
frame #12: 0x2a0752e8 CoreFoundation`__CFRunLoopRun + 1512
frame #13: 0x29fc3620 CoreFoundation`CFRunLoopRunSpecific + 476
frame #14: 0x29fc3432 CoreFoundation`CFRunLoopRunInMode + 106
frame #15: 0x313710a8 GraphicsServices`GSEventRunModal + 136
frame #16: 0x2d5ad808 UIKit`UIApplicationMain + 1440
frame #17: 0x0019ddd0 ReconInForce`main(argc=1, argv=0x003c4a5c) + 116 at main.m:16

Any thoughts on this issue?

Thanks in advance!

回答1:

Found a solution: doesn't seem like the problem was related to game center login so much...

I had a bit of code that took the form of:

-(void) setAnnimationsPlaying:(BOOL)annimationsPlaying{

    ...some other code...

    _annimationsPlaying = annimationsPlaying;

    if (annimationsPlaying)
        [self performSelector:@selector(xyz) withObject:nil afterDelay:0.1];

}

-(void) xyz{

    if (!self.annimationsPlaying)
       return;

    ...some other code...

    [self performSelector:@selector(xyz) withObject:nil afterDelay:6.0];

}

Replacing that code with something of this form solved my problem:

-(void) setAnnimationsPlaying:(BOOL)annimationsPlaying{

    ...some other code...

    _annimationsPlaying = annimationsPlaying;

    if (self.annimationsPlaying) {
        [self xyz];
        self.timer = [NSTimer scheduledTimerWithTimeInterval:6.0f target:self selector:@selector(xyz) userInfo:nil repeats:YES];
    }else{
        [self.timer invalidate];
    }

}

-(void) xyz{

    if (!self.annimationsPlaying)
       return;

    ...some other code...

}

Hope that helps!!