Xcode 4.3.3 を実行しており、iOS 5.1 をターゲットにしています。ゲームに Game Center 機能を含めようとしています。
GKLocalPlayer を認証すると、ユーザーにはGame Center へのサインインアラート ビューが表示されるか、ログインしているように表示されます。ルート ビュー コントローラーと次のエラーがコンソールから吐き出されます。
<GKModalRootViewController:メモリ アドレス> の外観の遷移を開始/終了するための不均衡な呼び出し。
アプリ デリゲートとルート ビュー コントローラーの間で GKLocalPlayer 認証コードを移動しようとしました。また、新しい空のプロジェクトに認証を実装しようとしました。ストーリーボードとARCの有無にかかわらず試しました。これらすべてのケースで、結果は同じでした: モーダルはルート ビュー コントローラーの背後に隠され、エラーが発生しました。
これは、アプリ デリゲートのapplication:didFinishLaunchingWithOptions:メソッドから呼び出している GKLocalPlayer 認証メソッドです。
- (void)authenticateLocalPlayer
{
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
[localPlayer authenticateWithCompletionHandler:^(NSError *error) {
if (localPlayer.isAuthenticated) {
// Perform additional tasks for the authenticated player.
} else {
// Disable Game Center features.
}
if (error) {
// Handle error.
}
}];
}
これがそのスクリーンショットです。この図では、ルート ビュー コントローラーの背景に 50% のアルファ値が設定されています。このバグにより、モーダルはルート ビュー コントローラーの背後にプッシュされました。
このstackoverflowの質問には、私が見つけることができるこのエラー(GKModalRootViewControllerに関して)への唯一の参照が含まれており、(a.)cocos2dを使用していないため、適合しません。(b.) セグエを実行するかどうかに関係なく発生し、viewWillAppear: または viewDidAppear: に触れていません。(c.) 納得できる回答が得られなかった。
This questionとthis oneは同じ問題 (ビュー階層が破棄されている) に関係しているようですが、回答がなく、コンソールのエラー メッセージについて言及していません。
これは他の誰かにも起こりますか?これを引き起こしている可能性のあるアイデアはありますか?
更新 1:初期化の競合を回避するために、認証コードをモーダル ビューのボタンに接続された IBAction に入れるようにしました。役に立ちませんでした。
更新 2:認証コードを GCD バックグラウンド キューに移動しようとしました。彼の結果は同じでした。
これがテスト プロジェクトです (これは、アプリのバンドル ID が既に入力されている GameCenter の準備ができています) 。
テストする:
- テスト デバイス/シミュレーターで Game Center からログアウトします (ログインしている場合)。
- アプリをビルドして実行します。
- 情報ボタンを押します。
- 認証を押します。
- Sign in to Game Center アラートが表示されたら、Create New Accountを押します。
- キャンセルを押します。
- 「Unbalanced calls...」というメッセージがコンソールに表示されましたか? モーダル ビュー (認証ボタン付き) は消えましたか?
- 情報ボタンを押します。
- モーダルは再び表示されましたか?