1

Game Kit は、authenticateWithCompletionHandler: に送信する完了ハンドラーへの強い参照を保存します。これは、ユーザーがアプリを終了してアプリに入るたびに、再度呼び出されることを意味します。これは理にかなっていますが、私が持っているユースケースで問題が発生します:

1) アプリの起動時に Game Center にログインするようユーザーに促します。

2) しばらくシングル プレイヤーでプレイしたいので、[キャンセル] をタップします。したがって、彼らはログインしていません。

3) ある時点で、彼らはオンラインでプレイすることに決めたので、私の [オンラインでプレイ] ボタンをタップします。

4) オンライン ゲームのオプションなどを設定できる画面が表示されるはずですが、認証済みのプレイヤーがいないことに気付きました。</p>

5) ユーザーに再度 Game Center へのログインを求めます。

6) 今回はユーザーがログインし、完了ハンドラーでオンライン ゲームのオプション画面を表示します。

ステップ 6 に問題があります。ユーザーがアプリを離れて再起動するたびに、完了ハンドラーが繰り返されるため、ゲーム オプション画面が表示されます。オンライン ゲームのオプションを表示するために完了ハンドラーのコードを取り出すと、ユーザーはボタンを 2 回タップする必要があります。

これに対する賢い解決策は何ですか?

参考までに、私のコードの簡略版は次のようになります。

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

私が読んだ例の多くは、ユーザーが初めてログインすることを前提としていますが、常にそうなるとは思いません。

よろしくお願いします。

4

1 に答える 1

1

これに対する 1 つの解決策は、完了ハンドラーがビューを変更しないようにすることです。完了ハンドラーは非同期的に呼び出され、認証を要求した後いつでも発生する可能性があるため、これは奇妙に思えます。

代わりに、完了ハンドラーは、ユーザーがオンライン メニューにいるかどうかを確認し、ボタンを有効にすることができます。それまでは、これらのボタンを無効にして、「Game Center を待っています」というメッセージを表示してください。重要なのは、完了ハンドラーでシーン遷移をトリガーしないことです。このブロックがいつ呼び出されるかわからないため、これは悪い設計です。

もう一つのヒント。ユーザーが Game Center へのログインを拒否した場合、ある時点で認証要求はユーザーにプロンプ​​トを表示しません。私の記憶が正しければ、GKErrorUserDeniedすぐに受け取ります。したがって、Game Center アプリ内からゲームを起動できることをユーザーに伝える必要があります。

于 2013-05-23T00:06:52.487 に答える