2013-03-07 3 views
2

2 인 실시간 게임으로 Game Center 초대를 구현하려고합니다. 초대장은 시뮬레이터에서 지원되지 않으므로 iOS5를 실행하는 하나의 기기와 iOS6을 실행하는 두 번째 기기에서이를 테스트하고 있습니다 (이는 의도 한대로 수행되었습니다).GameKit 경기 - iOS5와 iOS6 사이에 친구 초대

어느 기기에서든지 기존의 GKMatchmakerViewController UI를 사용하여 초대를 시작하면 iOS5 기기가 초대를 시작할 때뿐만 아니라 iOS6 기기가 초기화 할 때도 두 가지 방법으로 잘 작동합니다.

그러나 iOS6에서는 초대 할 플레이어를 직접 선택하기 위해 GKMatchRequest을 사용하여 프로그래밍 방식으로 초대를 실행하고 playersToInvite 속성을 설정합니다.

문제는 다른 (iOS5를) 장치가 초대 세부 게임 센터 UI를 보여주고 있지만, iOS6의 장치가 finishMatchmakingForMatch 요청을 보낼 경우에도 [GKMatchmaker sharedMatchmaker].inviteHandler 실행, 푸시 알림을 얻는 응용 프로그램을 시작,합니다 - iOS5를 장치가 더 이상 진행되지 않습니다. iOS5 컴퓨터에서 다른 핸들러/델리게이트가 호출되지 않으며 GKMatch 객체가 반환되지 않으며 "준비 완료"표시가있는 게임 플레이어 UI와 "[iOS6 플레이어 대기 중]이 시작될 때까지 계속 기다리고 있습니다."라는 메시지가 계속해서 나타납니다. 경기". 이 UI의 유일한 버튼은 취소 버튼입니다. 여기

는 iOS6의 컴퓨터에 초대를 전송하는 코드입니다 :

GKMatchRequest *request = [[[GKMatchRequest alloc] init] autorelease]; 
request.minPlayers = 2; 
request.maxPlayers = 2; 
request.playersToInvite = [NSArray arrayWithObject:playerID]; 
request.inviteMessage = message; 
request.inviteeResponseHandler = ^(NSString *playerID, GKInviteeResponse response) 
{ 
    if (response == GKInviteeResponseAccepted) 
     [[GKMatchmaker sharedMatchmaker] finishMatchmakingForMatch:self.match]; 
}; 
[[GKMatchmaker sharedMatchmaker] findMatchForRequest:request withCompletionHandler:^(GKMatch *match, NSError *error) 
{ 
    ... [whatever] 
}]; 

을 그리고 여기에 iOS5를 기계에 초대 처리기에 대한 코드입니다 :

다음과
[GKMatchmaker sharedMatchmaker].inviteHandler = ^(GKInvite *acceptedInvite, NSArray *playersToInvite) 
{ 
    if (acceptedInvite) 
    { 
     GKMatchmakerViewController *mmvc = [[[GKMatchmakerViewController alloc] initWithInvite:acceptedInvite] autorelease]; 
     mmvc.matchmakerDelegate = self; 
     [navController presentModalViewController:mmvc animated:YES]; 
    }); 
    else if (playersToInvite) 
    { 
     ... [whatever] 
    } 
} 

순서가 될 때 :

  • iOS6의는 iOS5를 플레이어 ID로 findMatchForRequest 요청을 보냅니다.
  • 푸시 알림이 iOS5 컴퓨터에 표시됩니다.
  • 응용 프로그램이 iOS5 시스템에서 실행되고 inviteHandler이 호출됩니다.
  • GKMatchmakerViewController은 초대 세부 사항이있는 iOS5 컴퓨터에 표시되며 iOS6 사용자는 회전 중 "연결 중"상태입니다.
  • iOS6 시스템에있는 이 호출되어 finishMatchmakingForMatch 요청을 보냅니다.
  • iOS5 게임 센터 화면의 iOS6 사용자 상태가 "연결 중"에서 "준비 중"으로 변경되며이 시점에서 두 플레이어는 모두 "준비 됨"으로 표시됩니다.
  • iOS6 컴퓨터는 match: player: didChangeState: 콜백을 받고 iOS5 플레이어가 GKPlayerStateConnected으로 표시되므로 iOS6 컴퓨터가 관련 프로세스가 완료되고 게임을 시작할 수있는 한 관련이 있습니다.
  • iOS5 시스템에서 아무 것도 일어나지 않습니다. 타임 아웃으로 취소 될 때까지 "[iOS6 사용자가 게임을 시작하기를 기다리는 중"으로] 붙어 있습니다. 언제든지 GKMatch 개체를받지 못하기 때문에 게임을 시작할 수 없습니다.

프로그래밍 가능한 초대장이 아닌 iOS6 컴퓨터에서 표준 게임 센터 UI를 사용하면 정상적으로 작동하므로 게임을 시작해야한다는 것을 다른 컴퓨터에 알리기 위해 표준 UI가 더 많은 작업을 수행해야합니다. 그러나 관련 게임 센터 개체를 모두 탐색하여 보낼 항목을 찾을 수 없었습니다.

역 구성 (표준 UI를 사용하여 초대를 시작하는 iOS5)이 두 시스템에서 모두 잘 작동한다는 점을 다시 언급해야합니다.

도움, 누구?

답변

0

비슷한 문제가 있습니다. 내가 부분적으로 해결 한 일 중 하나는 ios6 사용자에게는 프로그래밍 방식을 사용하고 ios5 사용자에게는 viewController를 사용하는 것입니다. 나는 당신이 그렇게하고 있다고 생각하지만 inviteHandler 코드는 viewController 코드만을 가진 것으로 보인다. 문제를 완전히 해결할 수 있었습니까?