5

を使用して、GameKit でローカル マッチメイキングを機能させようとしてい[[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:]ます。基本的に、私はインターフェイスのないローカル マッチを実装しようとしています。ローカルの近くにプレイヤーがいる限り、接続してマッチを開始したいと考えています。重要なことは、これをローカル プレイヤーに対してのみ実行したいということです。インターネット経由で自動的にマッチングすることは絶対にしたくありません。

iTunes Connect でアプリの Game Center を有効にし、テストに使用するすべてのデバイスで別のサンドボックス アカウントにサインアップしました。

GKMatchmakerViewControllerでのマッチメイキング(ローカル プレイヤーの認証後) と でのプログラムによるマッチメイキングの両方を試しましstartBrowsingForNearbyPlayersWithReachableHandler:た。同じコードを iPhone 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 );
        } ];
}

ドキュメントは、特にローカルのマルチプレイヤーとインターネット経由の対戦の違いに関しては、少しまばらで混乱を招きます。たとえば、マッチに参加するプレイヤーを見つける前に、ローカル プレイヤーを認証してマッチを作成する必要があるようです (任意の種類のマッチの作成はマッチ リクエストで開始します)。ただし、この小さなナゲットは別のことを示唆しているようです:

標準のユーザー インターフェイスにより、どちらのプレイヤーも現在 Game Center に直接接続していない場合でも、プレイヤーは近くにいる他のプレイヤーを見つけることができます。

さらに、近くのプレイヤーを検索する で説明されているフローでは、 に渡された通知ブロックを介してプレイヤーを見つけた後、ステップ 3 までマッチ リクエストは作成されませんstartBrowsingForNearbyPlayersWithReachableHandler:。残念ながら、私はそこまで到達したことはありません。

だから、質問:

startBrowsingForNearbyPlayersWithReachableHandler:1)ローカル プレイヤーを認証する前に呼び出すことができると考えるのは正しいですか? GameKit はエラーをスローしないので、問題ないと思います。これは無謀な仮定かもしれません。私が認証するかどうかは、あまり違いがないようです。

2) を使用してローカル自動マッチングを正常に実装した人はい[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:ますか? プレイヤーのブラウジングから試合の開始まで、すべてプログラムによって完全なフローを示す良いサンプル コードはありますか?

3) iOS シミュレーターで GameKit 対応アプリをテストできるかどうかについて、ウェブ上で相反する報告があるようです。一般的なコンセンサスはそうではないようで、iOS ハードウェアでテストすることをお勧めします。iPhone 4 と第 4 世代の iPod Touch を使用しています。ローカル マルチプレイヤーのテストに成功した人のために、どのようなテスト セットアップと方法論を使用しましたか?

4

3 に答える 3

1

これらのことを次の順序で行う必要があります。

  1. ローカル プレーヤーを認証する
  2. 招待ハンドラーをインストールする
  3. 近くのプレイヤーのブラウジングを開始

認証が必要です - これにより、アプリが Game Center に登録され、プレイヤーがログインします。ほとんどの場合、これを行うためにインターネット アクセスは必要ありません。

招待ハンドラーのインストールも必要ですが、これはあなたが見逃しているステップだと思います。これにより、インバウンドの招待を受け取ったときに何をすべきかをアプリに知らせることができます。これを行わないと、デバイスは近くにあると登録されません。

上記の 2 つを完了してから、ブラウジングを開始してください。

ここにいくつかのサンプルコードがあります。アプリの起動後にこのメソッドを呼び出します。

- (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 をリッスンするオブジェクトを登録し、これらのメソッドを実装します。

-player:didAcceptInvite:
-player:didRequestMatchWithRecipients:

これらのメソッドを iOS8 で実装しないと動作しません。

次に、ローカル プレーヤーを認証した後にこれを呼び出して、GKMatchmaker をそのオブジェクトにリンクします。

[localPlayer registerListener:self];

プロトコルを実装しているオブジェクトが .h ファイルで次のように宣言されていることを確認してください。

@interface MyImplementingObject : NSObject <GKMatchDelegate, GKLocalPlayerListener>

これらすべてを実行してもまだ機能しない場合は、バンドル ID がアプリに正しく設定されていることを確認してから (アプリをクリックし、[ターゲット] をクリックして、バンドル ID とバージョンが入力されていることを確認してください)、 「Capabilities」タブ (XCode 6) を開き、Game Center がオンになっていることを確認します。

メンバー センターに移動し、そのバンドル ID を使用するアプリのプロビジョニング プロファイルで Game Center が有効になっていることを確認します。必要に応じて、プロビジョニング プロファイルをダウンロードして再適用します。

GameCenter の [設定] でサンドボックス スイッチがオンになっていることを確認し、[招待を許可する] と [近くのプレイヤー] スイッチがオンになっていることを確認します。

最後に、必ず iTunes Connect に移動し、そこでもアプリに対して Game Center が有効になっていることを確認してください。

于 2014-10-07T04:26:59.417 に答える