2

2 人用のリアルタイム ゲームで Game Center の招待を実装しようとしています。招待はシミュレーターではサポートされていないため、iOS5 を実行する 1 つのデバイスと iOS6 を実行する 2 つ目のデバイスでこれをテストしています (これは意図的に行われます)。

いずれかのデバイスで昔ながらの組み込みGKMatchmakerViewControllerUI を使用して招待を開始した場合、iOS5 デバイスが招待を開始するときと iOS6 デバイスが招待を開始するときの両方の方法で問題なく動作します。

ただし、iOS6では招待するプレイヤーを独自のUIで選択したいので、属性GKMatchRequestを設定してプログラムで招待を発行するために使用しています。playersToInvite

問題は、他の (iOS5) デバイスがプッシュ通知を受け取り、アプリケーションを起動し、[GKMatchmaker sharedMatchmaker].inviteHandler.finishMatchmakingForMatchさらに遠く。iOS5 マシンで他のハンドラー/デリゲートが呼び出されず、GKMatchオブジェクトが返されず、両方のプレイヤーが「準備完了」とマークされ、「[iOS6 プレイヤー] がゲームを開始するのを待っています」というメッセージとともに Game Center UI が引き続き表示されます。 "。この 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]  
    }
}

シーケンスは次のとおりです。

  • iOS6findMatchForRequestは、iOS5 プレイヤー ID を使用してリクエストを送信します。
  • iOS5 マシンにプッシュ通知が表示されます。
  • アプリケーションが iOS5 マシンで起動され、inviteHandlerが呼び出されます。
  • GKMatchmakerViewController招待の詳細とともに iOS5 マシンに表示され、iOS6 ユーザーは「接続中」ステータスで回転します。
  • inviteeResponseHandleriOS6 マシンの が呼び出され、リクエストが送信されますfinishMatchmakingForMatch
  • iOS5 Game Center 画面での iOS6 ユーザーのステータスは、回転中の「接続中」から「準備完了」に変わり、この時点で両方のプレイヤーが「準備完了」としてマークされます。
  • iOS6 マシンはmatch: player: didChangeState:コールバックを受け取り、iOS5 プレイヤーを として表示しますGKPlayerStateConnected。iOS6 マシンに関する限り、マッチ プロセスは終了し、ゲームを開始できます。
  • これ以降、iOS5 マシンでは何も起こりません。タイムアウトでキャンセルされるまで、「[iOS6 ユーザー] がゲームを開始するのを待っています」でスタックします。GKMatchどの時点でもオブジェクトを受信しないため、ゲームを開始できません。

プログラム可能な招待ではなく、iOS6 マシンで標準の Game Center UI を使用すると問題なく動作するため、ゲームを開始する必要があることを他のマシンに伝えるために、標準の UI がさらに何かを行う必要があることを意味します。しかし、関連するすべての Game Center オブジェクトをブラウズしましたが、他に送信するものは見つかりませんでした。

逆の構成 (標準 UI を使用して招待を開始する iOS5) は、両方のマシンで正常に機能することを再度言及する必要があります。

誰か助けて?

4

1 に答える 1

0

私は同様の問題を抱えています。私が部分的に解決したことの 1 つは、ios6 ユーザーにはプログラマティックを使用し、ios5 ユーザーには viewController を使用することです。あなたもそうしていると思いますが、inviteHandler コードには viewController コードしかないようです。問題を完全に解決できましたか?

于 2013-03-26T10:27:19.723 に答える