私はGameCenter認証を処理するためのスニペットを示すスタックオーバーフローに関する記事を見てきました。しかし、これらのソリューションのいずれも、現実世界のユースケースがカバーする問題のいずれにも対処しません。つまり、[GKLocalPlayer localPlayer] .authenticateHandlerはステータスのコールバックだけであり、あまり多くはありません。これはView Controllerを提供しますが、認証された状態とエラー状態には大規模な不一致があります。GameCenter認証を行う適切な方法は何ですか?
私がやろうとしていますいくつかのことがあります。機能は、アプリの起動 3の上に静かに認証する 2.トライは、ユーザ理由にいくつかの情報を提供し、それを使用するまで 1.ゲームセンターログインをポップアップ表示されませんGameCenterの機能が動作しない 4.復旧メカニズムを提供する
エラーが報告された場合、どうしてログインダイアログを表示するにはどうすればよいですか?
ケース1:
がノーのViewControllerと、このエラーが出るGameCenterManagerで
エラー:: authenticateLocalPlayerは、[インターネット接続がオフラインであるように思われる。]
にもかかわらず、そのエラーメッセージは、デバイスが完全にオンラインになっています。サファリがcnn.comを正常にロードするためです。
ケース2:彼らは準備ができていないので、
誰かがログイン画面を閉じ、ケースが.authenticatedているが、真戻ってくる、のViewControllerはゼロのままで、まだすべてのゲームセンターは失敗します呼び出します。 [GKLocalPlayer localPlayer] .authenticatedがtrueに設定されているのはなぜですか?
ケース3:GameCenterManager :: authenticateLocalPlayer [操作 で
エラーを完了できませんでした。 (NSURLErrorDomainエラー-1009)]
これはまだ発生しますが、アプリケーションはユーザーのために何もできません。この場合、メッセージはどのようなものになりますか?アプリケーションをGame Centerに切り替えてそこにログインしますか?
ケース4:GameCenterManager :: authenticateLocalPlayer [。要求された 操作がキャンセルまたはユーザーによって無効にされている]
ユーザーがアプリのViewControllerをキャンセルした場合、この問題が発生した中
エラーリンゴでプレゼントするように言われました。しかし、この状態を回復または検出することもありません。
ケース5:ローカルプレーヤーが認証されていないので、GameCenterManager :: createMatch [要求された操作で
エラーが 完了できませんでした。]
これはユーザーがログインした場合に発生しますが、何らかの理由でGameCenterからログアウトしてからアプリケーションに戻ります。このアプリは、明らかにそうでないときにユーザーが認証されていると言われますが、別のログインを呼び出すためのコールはありません。
GameCenterが静かに働くだけでなく、アプリケーションデザイナーとして何をするのでしょうか。アラートビューを表示し、ゲームセンターアプリを使用してログインしてアプリを再起動するように指示しますか?ユーザーが認証されていない場合は、一度アプリの起動時に、うまくいけば、有効なログイン状態を作成するために、そして第二、彼らはアプリを使用してみてください:この関数は2回呼び出され
//****************************************************** // Authenticate //****************************************************** -(void)authenticateLocalPlayer:(bool)showLogin { if(showLogin && self.loginScreen != nil) { [[WordlingsViewController instance] presentViewController:self.loginScreen animated:YES completion:nil]; } if([GKLocalPlayer localPlayer].isAuthenticated) { NSDLog(NSDLOG_GAME_CENTER,@"GameCenterManager::authenticateLocalPlayer LocalPlayer authenticated"); } __weak GameCenterManager* weakSelf = self; [GKLocalPlayer localPlayer].authenticateHandler = ^(UIViewController *viewController, NSError *error) { if (error != nil) { NSDLog(NSDLOG_GAME_CENTER,@"Error in GameCenterManager::authenticateLocalPlayer [%@]", [error localizedDescription]); } else { if (viewController != nil) { NSDLog(NSDLOG_GAME_CENTER,@"GameCenter: No authentication error, but we need to login"); weakSelf.loginScreen = viewController; } else { if ([GKLocalPlayer localPlayer].authenticated) { NSDLog(NSDLOG_GAME_CENTER,@"GameCenter localPlayer authenticated"); weakSelf.gameCenterAvailable = YES; weakSelf.localPlayer = [GKLocalPlayer localPlayer]; [weakSelf retrieveFriends]; [weakSelf loadPlayerPhoto:weakSelf.localPlayer]; for (id<GameCenterDelegate> listener in weakSelf.listeners) { [listener onPlayerAuthenticated]; } } else { weakSelf.gameCenterAvailable = NO; } } } }; }
:ここ
は私の認証コードでありますゲームセンターが必要な機能このアプリでは、ターンベースのマッチや友達を見ることができます。
私は、エラーが設定されたポストビューコントローラの場合、アプリを強制終了するための手順を警告表示にポップする必要があります。フィードバックを感謝し、私たちは非常に似たような扱いがあるので、私は悪く感じません。 –