2014-10-30 1 views
1

this tutorial을 사용하여 게임을 만들었습니다. 내가 지금처럼 authenticateLocalPlayer를 호출 할 때 :목표 C GameCenter authenticateHandler 오류

GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 

localPlayer.authenticateHandler = 
^(UIViewController *viewController, NSError *error) { 

    [self setLastError:error]; 
    if(viewController != nil) { 
     [self setAuthenticationViewController:viewController]; 
    } else if([GKLocalPlayer localPlayer].isAuthenticated) { 
     _enableGameCenter = YES; 
    } else { 
     _enableGameCenter = NO; 
    } 
}; 

나는 오류 얻을 :

-[GKUnauthenticatedPlayerInternal name]: unrecognized selector sent to instance 0x14517e00 

을하지만이 같은 [NSThread sleepForTimeInterval:1]을 추가 할 때 :

GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 

[NSThread sleepForTimeInterval:1]; 
localPlayer.authenticateHandler = 
^(UIViewController *viewController, NSError *error) { 

    [self setLastError:error]; 
    if(viewController != nil) { 
     [self setAuthenticationViewController:viewController]; 
    } else if([GKLocalPlayer localPlayer].isAuthenticated) { 
     _enableGameCenter = YES; 
    } else { 
     _enableGameCenter = NO; 
    } 
}; 

그것은 잘 작동을 시작합니다. 이것이 오류를 해결하는 올바른 방법입니까?

+0

NSThread 해킹이 작동하지 않습니다. 혹시 이것에 대한 더 많은 정보를 찾았거나 더 나은 해킹을 찾았습니까? – erdekhayser

답변

0

나는 아주 동일한 문제가 있습니다. 그리고 임의의 수면은 나를 위해 그것을 해결하지 않습니다.

인터넷에서이 문제에 대한 다른 언급을 찾을 수 없다는 것이 이상한 일입니다. 우리는이 문제가있는 유일한 사람들 일 수는 없습니다.

+0

나는 내 게임에 최근에이 문제가 있다는 것을 깨달았습니다. 그것의 근원을 모른다. 내가 돌아 왔을 때 (만약에?) 나는 반대편에서 돌아온다! – erdekhayser

+0

그래서 호출이'localPlayer.authenicateHandler =^(UIViewController * viewController, NSError * error) {}'줄에서 발견되었습니다. 블록이 비어있는 경우에도 *가 발생합니다 *. – erdekhayser

+0

네, 저도 발견했습니다. 그리고 그게 애플의 권장 방법 인 것 같다. 그래서 나는 어떻게 다른 사람들이 이것을하고 있는지 궁금해합니다. – Daniel

0

나를 위해 충돌을 유발 한 원인이 [self performSelector: @selector(showLabel) withObject: nil afterDelay: 5], (self는 SKSpriteNode) 로의 호출임을 알게되었습니다. 선택기가 호출 된 순간이 아니라 performSelector가 호출 될 때 충돌이 발생했습니다. 또한이 호출은 GKLocalPlayer 또는 Game Center와 전혀 관련이 없습니다. 문제를 해결 무엇

은 다음과 같이 대신 SKAction을 사용하는 것이었다 :이 트릭을 않는 이유를 정말 설명 할 수

[self runAction: 
     [SKAction sequence: @[[SKAction waitForDuration:5], 
          [SKAction performSelector: @selector(showLabel) onTarget: self]]]]; 

. 이전에는 문제가 없었기 때문에 iOS 8.1에서는 너무 명백한 버그가 아닙니다.

0

viewDidLoad에서 게임 센터를 시작하라는 속임수가없는 것 같습니다. 거기에서 전화를 걸면 지연된 후에 전화하십시오. 이전에는 문제가 없었기 때문에 iOS 8.1 및 8.1.1에서이 문제가 해결되었다고합니다.

0

이것이 iOS 8.0-8.2의 문제인 것으로 보입니다. 내 실험에서 iOS 8.3에서 해결 된 것 같습니다. 이상하게도, 내 다른 게임의 코드 기반은 일관되게 (나는 철저한 테스트를하지는 않았다) 계속 작동하는 것처럼 보인다.