Ошибка в пошаговом многопользовательском игровом центре в iOS 8.3

Я хочу сделать пошаговую игру-головоломку типа mutiplayer. Она отлично работает со всеми функциями, включая получение уведомлений о конце хода любого игрока. Но в iOS 8.3 Я не могу получить метод calld, пока игрок не завершает игру. Есть решение?

Я также зарегистрировал Listener. Но это не называется. Вот код..

- (void)authenticateLocalUser {

    if (!gameCenterAvailable) return;

    NSLog(@"Authenticating local user...");
    if ([GKLocalPlayer localPlayer].authenticated == NO) {

        __weak typeof(self) weakSelf = self;
        __weak GKLocalPlayer *weakPlayer = [GKLocalPlayer localPlayer];

        weakPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) {
            if (viewController != nil) {
                [weakSelf showAuthenticationDialogWhenReasonable:viewController];
            } else if (weakPlayer.isAuthenticated) {
                // Player has been authenticated!
                [weakPlayer unregisterAllListeners];

                [weakPlayer registerListener:weakSelf];

        //       GKTurnBasedEventHandler *ev =
        //        [GKTurnBasedEventHandler sharedTurnBasedEventHandler];
        //       ev.delegate = self;

            } else {
                // Should disable Game Center?
            }
        };    
    }
}

1 ответ

Поскольку вы упомянули об окончании хода, возможно, вы столкнулись с ошибкой, которая была введена в IOS8.3 и которая вызывала сбой уведомлений после того, как активный игрок вызывает endTurnWithNextParticipants, как обсуждалось здесь: endTurnWithNextParticipants не запускает receiveTurnEventForMatch после обновления до iOS 8.3 и swift 1.2

Здесь предлагается несколько способов решения этой проблемы, но единственное решение, которое я нашел и которое работает надежно, - это установить цикл таймера на неактивных устройствах и продолжать загружать данные совпадений, пока вы не увидите, что станете текущим участником. Это то, что я использую:

-(void)isMatchActive:(NSTimer *)timer
{
    NSString *matchID = (NSString *)timer.userInfo;

    [GKTurnBasedMatch loadMatchWithID:matchID withCompletionHandler:^(GKTurnBasedMatch *match, NSError *error)
    {
        GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
        GKTurnBasedParticipant *currentParticipant = match.currentParticipant;

        if ([localPlayer.playerID isEqualToString:currentParticipant.player.playerID])
        {
            //we have become active. Call the event handler like it's supposed to be called
            [self player:localPlayer receivedTurnEventForMatch:match didBecomeActive:false];
        }
        else
        {
            //we are still waiting to become active. Check back soon
            float dTime = 5.0;
            gameController.IOS8BugTimer = [NSTimer scheduledTimerWithTimeInterval:dTime
                                                                          target:self
                                                                     selector:@selector(isMatchActive:)
                                                                     userInfo:matchID
                                                                      repeats:NO];
         }
     }];
}
Другие вопросы по тегам