2013-08-07 1 views
5

[[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:]을 사용하여 GameKit에서 로컬 매치 메이킹을 시도하고 있습니다. 본질적으로, 나는 인터페이스가없는 로컬 매치를 구현하려고 노력하고있다 : 나의 지역 근처에 플레이어가있는 한, 나는 연결하고 경기를 시작하고 싶다. 중요하게도, 은 로컬 플레이어에게이 작업을 원합니다. 은 인터넷을 통해 자동으로 일치합니다.일부 startBrowsingForNearbyPlayersWithReachableHandler 질문

iTunes에서 게임용 게임 센터를 연결하고 테스트 할 때 사용하는 모든 장치에서 다른 샌드 박스 계정에 가입했습니다.

(로컬 플레이어 인증 후)과 프로그래밍 방식 중매를 시도하고 startBrowsingForNearbyPlayersWithReachableHandler:으로 아이폰 4와 4 세대 iPod Touch에서 동일한 코드를 실행하여 내 책상 옆에 ​​앉아 있습니다. 어느 누구도 다른 것을 찾지 못한다. GKMatchmakerViewController를 사용하는 경우 근처의 플레이어를 찾기위한 인터페이스는 startBrowsingForNearbyPlayersWithReachableHandler:를 사용하는 경우, 그리고 알림 블록은 결코

스피너를 호출되지 도착 ...

찾기 플레이어에 남아있다.

다음은 테스트 코드의 내 현재 블록의 :

-(void)connectLocal 
{ 
    if(![GKLocalPlayer localPlayer].isAuthenticated) 
    { 
     // authenticateLocalPlayer calls connectLocal again after authentication is complete 
     [ self authenticateLocalPlayer ]; 
     return; 
    } 
    [[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:^(NSString *playerID, BOOL reachable) { 
      NSLog(@"Reachability changed for player %@", playerID); 
     } ]; 
} 

워드 프로세서는 지역 mulitplayer의 차이에 와서 인터넷을 통해 일치 특히 조금 스파 스 &이 주제에 혼란 있습니다. 예를 들어, 로컬 플레이어를 인증하고 해당 경기에 참여할 플레이어를 찾기 전에 일치 항목을 만드는 것이 필요합니다 (Creating Any Kind of Match Starts with a Match Request). 그러나 this little nugget은 다른 방법으로 제안하는 것처럼 보입니다.

표준 사용자 인터페이스를 사용하면 두 플레이어가 현재 Game Center에 직접 연결되어 있지 않아도 근처의 다른 플레이어를 찾을 수 있습니다.

또한 Searching For Nearby Players에 기재된 유동에 일치 요청 startBrowsingForNearbyPlayersWithReachableHandler:에 전달 통지 블록 통해 찾는 선수 후 3 단계 까지 생성되지 않는다. 불행히도, 나는 그것을 결코 멀리 얻지 못했습니다.

그래서, 질문 :

1) 맞죠 내가 로컬 플레이어를 인증하기 전에 startBrowsingForNearbyPlayersWithReachableHandler:를 호출 할 수 있습니다 생각에? GameKit은 오류를 발생시키지 않으므로 괜찮다고 가정합니다. 이것은 성급한 가정 일 수 있습니다. 내가 인증하든 안하든별로 차이가없는 것 같습니다.

2) 누구나 [GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:을 사용하여 로컬 자동 검색을 성공적으로 구현 했습니까? 플레이어 탐색에서 프로그래밍 방식으로 게임 시작에 이르기까지 완벽한 흐름을 보여주는 좋은 예제 코드가 있습니까?

3) iOS 시뮬레이터에서 GameKit 지원 앱을 테스트 할 수 있는지 여부에 대한 웹에서 충돌하는 보고서가있는 것 같습니다. 일반적인 합의가 이루어지지 않았으므로 iOS 하드웨어에서 테스트하는 것이 좋습니다. 나는 iPhone 4 &과 4 세대 iPod Touch를 사용 해왔다. 로컬 멀티 플레이어를 성공적으로 테스트 한 사람들은 어떤 테스트 설정 & 방법을 사용 했습니까?

+0

흠. 전혀 대답이 없습니다. 나는 똑같은 문제가있다. – bobmoff

+0

나는 애플 기술 지원부에 이것에 대해 지금 물어 보았다. .. 잘하면 그들이 대답을 알고있다. – bobmoff

답변

1

는이 순서대로 일을 할 필요가 게임 센터에 앱을 등록하고 플레이어를 기록합니다. 대부분의 경우 인터넷 액세스가 필요하지 않습니다.

초대장 처리기를 설치하는 것도 필수이며, 이것이 누락 된 단계라고 생각합니다. 이렇게하면 앱이 인바운드 초대를 받았을 때 수행 할 작업을 알 수 있습니다. 이 작업을 수행하지 않으면 장치가 근처에 등록되지 않습니다.

위의 두 가지를 완료 한 후에 만 ​​검색을 시작하십시오.

다음은 몇 가지 샘플 코드입니다. 응용 프로그램 출시 후이 메서드를 호출 :

- (void) authenticateLocalPlayer 
{ 

    static BOOL gcAuthenticationCalled = NO; 
    if (!gcAuthenticationCalled) { 
     GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 

     void (^authenticationHandler)(UIViewController*, NSError*) = ^(UIViewController *viewController, NSError *error) { 
      NSLog(@"Authenticating with Game Center."); 
      GKLocalPlayer *myLocalPlayer = [GKLocalPlayer localPlayer]; 
      if (viewController != nil) 
      { 
       NSLog(@"Not authenticated - storing view controller."); 
       self.authenticationController = viewController; 
      } 
      else if ([myLocalPlayer isAuthenticated]) 
      { 
       NSLog(@"Player is authenticated!"); 

       //iOS8 - register as a listener 
       [localPlayer unregisterAllListeners]; 
       [localPlayer registerListener:self]; 

       [[GKLocalPlayer localPlayer] loadFriendPlayersWithCompletionHandler:^(NSArray *friendPlayers, NSError *error) { 

        //Do something with the friends 

       }]; 

       //iOS7 - install an invitation handler 
       [GKMatchmaker sharedMatchmaker].inviteHandler = ^(GKInvite *acceptedInvite, NSArray *playersToInvite) { 
        // Insert game-specific code here to clean up any game in progress. 
        if (acceptedInvite) 
        { 
         //This player accepted an invitation. 
         //If doing programmatic matchmaking, call GKMatchmaker's matchForInvite:completionHandler 
         //to get a match for the invite. Otherwise you need to allocate a GKMatchmakerViewController 
         //instance and present it with the invite. 

        } 
        else if (playersToInvite) 
        { 
         //Your game was launched from the GameCenter app to host a match. 
        } 
       }; 

       //Now you can browse. Note this is the iOS8 call. The iOS7 call is slightly different. 
       [[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithHandler:^(GKPlayer *player, BOOL reachable) { 

        NSLog(@"Player Nearby: %@", player.playerID); 

       }]; 



      } 
      else 
      { 
       //Authentication failed. 
       self.authenticationController = nil; 
       if (error) { 
        NSLog([error description], nil); 
       } 
      } 


     }; 

     localPlayer.authenticateHandler = authenticationHandler; 
     gcAuthenticationCalled = YES; 
    } 
} 

* 중요 당신이 iOS8의를 사용하는 경우 * , 설치하지 않는 초대 핸들러. 대신 프로토콜 GKLocalPlayerListener 인식하는 등 객체를 등록하고 이러한 메소드를 구현 : 당신이 iOS8의에서이 메소드를 구현하지 않으면

-player:didAcceptInvite: 
-player:didRequestMatchWithRecipients: 

, 그것은 작동하지 않습니다!

당신은 다음 로컬 플레이어를 인증 한 후이를 호출하여 해당 개체에 GKMatchmaker 연결 :

[localPlayer registerListener:self]; 

이 때문에처럼 확인 프로토콜을 구현하는 것 객체가 선언되어 있는지 확인합니다.H 파일 :

@interface MyImplementingObject : NSObject <GKMatchDelegate, GKLocalPlayerListener> 

모든이 작업을 수행하고 그것은 여전히 ​​작동하지 않는 경우, 당신은 당신의 번들 ID는 앱에서 올바르게 설정되어 있는지 확인 (확인 번들 식별자를, 응용 프로그램을 클릭하여 '대상'을 클릭 할 버전을 입력 한 다음 '기능'탭 (XCode 6)을 클릭하고 게임 센터가 켜져 있는지 확인하십시오.

회원 센터로 이동하여 해당 번들 ID를 사용하는 앱의 프로비저닝 프로파일에 대해 Game Center가 사용 설정되어 있는지 확인하십시오. 필요한 경우 프로비저닝 프로파일을 다운로드하여 다시 적용하십시오.

GameCenter의 설정에서 샌드 박스 스위치가 켜져 있고 '초대 허용'및 '근처 플레이어'스위치가 켜져 있는지 확인하십시오.

마지막으로 iTunes Connect로 이동하여 Game Center에 앱이 활성화되어 있는지 확인하십시오.

+0

Game Center를 처음 사용하는 사용자는 GitHub의 Game Center 앱 샘플을 볼 수 있습니다. Game Center를 인증하고 주변 플레이어와 연결하고 음성 채팅을 시작하는 바닐라 앱입니다. 현재 iOS8에서 음성 채팅과 관련된 버그가 있습니다.이 앱은 이러한 문제를 설명하기 위해 만들어졌습니다. https://www.github.com/sbudhram/GameCenterDemo –

2

1) 로컬 플레이어를 인증하기 전에 startBrowsingForNearbyPlayersWithReachableHandler를 호출 할 수 있다고 생각합니까? 가장 중요한 것은 다른 선수지만,에 대한 기존의 플레이어와 검색 광고를 모두

번호 startBrowsingForNearbyPlayersWithReachableHandler 작품, 그것은 플레이어를 식별하는 데 사용하는 정보는 플레이어가 인증 될 때까지 사용할 수 없습니다 것 playerID ...입니다.

3) iOS 시뮬레이터에서 GameKit 지원 앱을 테스트 할 수 있는지 여부에 대한 웹에서 충돌하는 보고서가있는 것 같습니다. 일반적인 합의가 아니라 iOS 하드웨어에서 테스트하는 것이 더 좋습니다.

GameCenter 인증, 업적 및 리더 보드가 시뮬레이터에서 작동하므로 다른 모든 것은 실제 하드웨어에서 테스트해야합니다. 실제로 인증 테스트를 위해 시뮬레이터를 권장합니다. 이는 다소 혼란스러운 장치에 대한 세부적인 인증 테스트를 수행 할 수있는 샌드 박스/생산 스위치를 피할 수 있기 때문입니다. 다른 모든 것은 장치에서만 테스트 할 수 있습니다. 시뮬레이터는 일치 설정을 위반하는 푸시 알림 수신에 대한 큰 지원을하지 못하며 일반적인 하드웨어 구성은 일치 통신이 어쨌든 올바르게 작동하지 않을만큼 충분히 다릅니다. 이 -

  • 은 핸들러에게

    인증이 필요 근처 플레이어

  • 에 대한
  • 시작 브라우징을 초대 설치

    1. 로컬 플레이어를 인증 :

  • 1

    그래서 iOS7과 iOS8의 차이점을 명심하십시오. 이 코드는 두 버전 모두에서 작동하며 'updateNearbyPlayer'를 차례로 호출합니다.

    if (IS_IOS8) 
    { 
        [[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithHandler:^(GKPlayer *gkPlayer, BOOL reachable) 
        { 
         NSLog(@"PLAYER ID %@ is %@",gkPlayer.playerID,[email protected]"reachable" : @"not reachable"); 
         [self updateNearbyPlayer:gkPlayer reachable:reachable]; 
        }]; 
    
    } else { 
        /* 
        * iOS 7... 
        */ 
        [[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:^(NSString *playerID, BOOL reachable) 
        { 
         NSLog(@"PLAYER ID %@ is %@",playerID,[email protected]"reachable" : @"not reachable"); 
    
         [GKPlayer loadPlayersForIdentifiers:@[playerID] withCompletionHandler:^(NSArray *players, NSError *error) { 
          NSLog(@"Loaded: %@, error= %@",players,error); 
          GKPlayer *gkPlayer = [players objectAtIndex:0]; 
          [self updateNearbyPlayer:gkPlayer reachable:reachable]; 
         }]; 
        }]; 
    } 
    

    기본 Bonjour 서비스로 인해 약간의 지연이 발생하더라도이 메커니즘은 훌륭하게 작동합니다. 그러나,에 대한 적절한 호출과 균형을 맞추도록 할 필요가 :

    [[GKMatchmaker sharedMatchmaker] stopBrowsingForNearbyPlayers]; 
    

    당신이 경기를 설립하거나 기존의 일치에 추가보고 GKPlayers/PlayerIDs 중 하나를 사용할 때마다

    , 당신이 검색을 중지해야합니다. 경기가 종료되거나, 닫히거나 취소되면 다시 탐색을 시작하십시오. 그렇지 않으면 두 번째 시도가 근처 장치에 연결하면 실패합니다.