7

起動時に、各デバイスで次のメソッドを呼び出すことにより、デバイス間のゲーム センター サーバー上のすべての一致をプログラムでクリアしようとしています。

/**
 *  called to authenticate the players game centre id
 */
- (void)authenticateLocalUser
{
    if (!self.gameCentreAvailable)          return;

    NSLog(@"Authenticating Local User.");

    if ([GKLocalPlayer localPlayer].authenticated == NO)
    {
        [[GKLocalPlayer localPlayer] setAuthenticateHandler:^(UIViewController* viewcontroller, NSError *error)
        {
            NSLog(@"Inside Authentication Handler.");

            //  if there was no error, and we got a valid view controller to display
            if (!error && viewcontroller)
            {
                //  get a handle to the app delegate
                AppDelegate *delegate       = [UIApplication sharedApplication].delegate;

                //  use the view controller in the app delegate to present the authentication view controller
                [delegate.viewController presentViewController:viewcontroller animated:YES completion:
                ^{
                    //  once the view controller has been displayed, register the change in authentication
                    [self authenticationChanged];
                }];

                //  set this class as the event handler delegate
                GKTurnBasedEventHandler *event  = [GKTurnBasedEventHandler sharedTurnBasedEventHandler];
                event.delegate                  = self;
            }

            //  load all of the matches the player is currently a part of
            [GKTurnBasedMatch loadMatchesWithCompletionHandler:^(NSArray *matches, NSError *error)
            {
                NSLog(@"Error loading matches: %@", error);

                //  for each match
                for (GKTurnBasedMatch *match in matches)
                {
                    //  log the id of the match
                    NSLog(@"ID of match we are removing: %@", match.matchID);

                    //  and then remove it
                    [match removeWithCompletionHandler:^(NSError *error)
                    {
                        NSLog(@"Error removing match: %@", error);
                    }];
                }
            }];
        }];
    }
    else
        NSLog(@"Already Authenticated.");
}

ただし、この方法は機能せず、代わりにコンソールに次のエラーが表示されます。

2012-11-05 08:32:39.699 Spinning Yarn[6266:907] 一致の削除エラー: エラー Domain=GKErrorDomain Code=17 「1 つ以上のパラメーターが無効なため、要求された操作を完了できませんでした。」UserInfo=0x1e5b2140 {NSLocalizedDescription=1 つまたは複数のパラメーターが無効なため、要求された操作を完了できませんでした。}

発生している唯一のエラーは、removeWithCompletionHandler の内部です。それ以外はすべて問題なく、エラーはありません。

どんな助けでも素晴らしいでしょう。

4

1 に答える 1

4

removeWithCompletionHandler のリファレンスから:

アクティブな参加者としてローカル プレイヤーがいる試合でこのメソッドを呼び出すのは、プログラミング エラーです。

http://developer.apple.com/library/ios/#documentation/GameKit/Reference/GKTurnBasedMatch_Ref/Reference/Reference.html

マッチが削除に適していることを確認していません。ユーザーを「削除」する前に、そのユーザーの一致を終了する必要がある場合があります。さらに、この方法は通常、自動的にではなく、ユーザーが選択してゲームを削除することを目的としています。

于 2012-11-05T15:43:53.853 に答える