Ошибка в пошаговом многопользовательском игровом центре в 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];
}
}];
}