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];
}
}];
}
私が読んだ例の多くは、ユーザーが初めてログインすることを前提としていますが、常にそうなるとは思いません。
よろしくお願いします。