2013-05-22 2 views
1

Game Kit는 authenticateWithCompletionHandler :로 보내는 완료 핸들러에 대한 강력한 참조를 저장합니다. 즉, 사용자가 앱을 종료하고 입력 할 때마다 다시 호출됩니다. 이는 의미가 있지만 사용 케이스에 문제가 있습니다.Game Center 인증이 해당 블록을 반복하지 않도록하는 방법

1) 앱 시작시 사용자에게 게임 센터에 로그인하라는 메시지가 표시됩니다.

2) 잠시 동안 싱글 플레이어를 재생하기를 원하기 때문에 취소를 누릅니다. 따라서 그들은 로그인하지 않았습니다.

3) 어느 시점에서, 그들은 온라인으로 게임하기를 원하기 때문에 "온라인 플레이"버튼을 누릅니다. 내가 다시 사용자에게 메시지를 표시

5)

4)이 그들이 등 온라인 게임 옵션을 설정할 수있는 화면을 표시한다고하지만, 나는 그들이 어떤 인증 된 플레이어가없는 통지, 그래서 ...이 게임에 로그인하기 센터.

6)이 시간에 사용자가 로그인하고 완료 처리기에 온라인 게임 옵션 화면이 표시됩니다.

6 단계는 문제가있는 곳입니다. 사용자가 게임을 종료하고 다시 입력 할 때마다 완료 처리기가 반복되어 내 게임 옵션 화면이 표시됩니다. 완료 처리기의 코드를 온라인 게임 옵션을 표시하는 데 꺼내면 사용자는 버튼을 두 번 눌러야합니다. 한 번 로그인하려면 한 번, 온라인 옵션을 표시하려면 다시 한번 누릅니다.

이 스마트 솔루션은 무엇입니까? 참고로

는, 내 코드의 단순화 된 버전은 다음과 같습니다

- (IBAction)playOnlineTapped:(id)sender 
{ 
    GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 
    [localPlayer authenticateWithCompletionHandler:^(NSError *error) { 
    if (localPlayer.authenticated) { 
      [self showOnlineGameOptions]; 
    } 
    }]; 
} 

내가 처음에 사용자 로그,하지만 난 그게 항상 거라고 생각하지 않는 가정 읽고 예제 이렇게 많은 그럴 수 있습니다.

미리 도움 주셔서 감사합니다.

답변

1

완성 된 처리기에서보기를 변경하지 않는 것이 하나의 해결책입니다. 완성 처리기가 비동기 적으로 호출되어 인증을 요청한 후에도 언제든지 발생할 수 있기 때문에 이는 이상한 생각입니다.

대신 완료 처리기가 온라인 메뉴에 있는지 그리고 단추를 사용할 수 있는지 확인할 수 있습니다. 그때까지이 버튼을 비활성화하고 "Game Center를 기다리는 중"이라는 메시지를 표시하십시오. 핵심은 완료 핸들러에서 장면 전환을 트리거하지 않는 것입니다. 이 블록이 호출되는 시점을 알지 못하기 때문에 나쁜 설계가됩니다.

또 다른 힌트. 사용자가 Game Center에 로그인을 거부하면 인증 요청에 따라 사용자에게 메시지가 표시되지 않습니다. 내가 기억한다면, 즉시 GKErrorUserDenied을 받게 될 것입니다. 따라서 사용자에게 Game Center 앱 내에서 게임을 시작할 수 있다고 말해야합니다.

+0

이것은 조금 더 가깝지만 여전히 그렇습니다. 문제는 GamePoint에 로그인 한 다음 온라인 버튼을 누를 때 뭔가를해야한다는 것입니다. – FizzBuzz