Gamecenter ios 9 Методы GameCenter GKLocalPlayerListener не вызваны

Речь идет о GameCenter,

С тех пор как GKLocalPlayerListener Протокол наследует методы от GKChallengeListener, GKInviteEventListener, а также GKTurnBasedEventListener,

Для обработки нескольких событий "и" не реализуйте GKChallengeListener, GKInviteEventListener, а также GKTurnBasedEventListener непосредственно; воплощать в жизнь GKLocalPlayerListener вместо.

Вы можете прослушивать и обрабатывать несколько событий, используя GKLocalPlayerListener" (это из яблочных документов).

Можно ожидать, что после регистрации GKLocalPlayerListener после GKLocalPlayer.localPlayer() затем все методы в GKLocalPlayerListener будет вызван, когда соответствующие события произойдут.

Однако, кроме "игрок (игрок: GKPlayer, полученный TurnEventForMatch соответствует: GKTurnBasedMatch, didBecomeActive: Bool) ", который вызывается, все остальные методы, включая" ​​player (player: GKPlayer, matchEnded match: GKTurnBasedMatch) "никогда не вызывается, когда происходит такое событие.

Нужно ли регистрировать какого-то другого слушателя или мне чего-то не хватает?

4 ответа

Что касается обнаружения того, что вас пригласили на пошаговое совпадение: событие не отправляется, но когда вы запрашиваете список совпадений с сервера, у вас просто неожиданно появляется новое совпадение (и ваш статус будет приглашен). (получатель действительно получает приглашение UIAlert, что он получил приглашение, хотя)

Что касается того, когда / когда срабатывают различные функции API, я потратил много- много-много часов, пытаясь расшифровать, когда срабатывают эти различные функции. Я открыл больше, чем несколько ошибок в отношении функций или документации. Вот мои текущие заметки; Вот как я организовал все функции-делегаты в своем классе помощников, указав, к какому слушателю они применяются, а также заметки о том, что вызывает их срабатывание.

Вы можете видеть, что есть несколько, которые я никогда не расшифровывал. Любые дополнительные входные данные / разъяснения в этом списке будут с благодарностью.

#pragma mark - specific to real-time matches
//this is for real-time matches only (but the docs don't say that)
-(void)player:(GKPlayer *)player didAcceptInvite:(GKInvite *)invite



#pragma mark - saved game listener (GKSavedGameListener)
//never fires. Theory: only fires if the SAME player tries to save the game from a different device while being the active player
-(void)player:(GKPlayer *)player didModifySavedGame:(GKSavedGame *)savedGame

//never fires. Theory: only fires if the SAME player tries to save the game from a different device while being the active player
-(void)player:(GKPlayer *)player hasConflictingSavedGames:(NSArray *)savedGames



#pragma mark - game launched via game center (GKLocalPlayerListener)
//DEPRECATED: This is fired when the user asks to play with a friend from the game center.app
-(void)player:(GKPlayer *)player didRequestMatchWithPlayers:(NSArray *)playerIDsToInvite

//This is fired when the user launches the game from Game Center and requests to play with a friend
-(void)player:(GKPlayer *)player didRequestMatchWithRecipients:(NSArray *)recipientPlayers

//Never seen this fire. Possibly fired when the user launches the game from Game Center. Unclear how this varies from didRequestMatchWithRecipients
-(void)player:(GKPlayer *)player didRequestMatchWithOtherPlayers:(NSArray *)playersToInvite



#pragma mark - Ending turn based matches (GKLocalPlayerListener)
//I've never seen this fire
-(void)player:(GKPlayer *)player matchEnded:(GKTurnBasedMatch *)match

//I've never seen this fire
-(void)player:(GKPlayer *)player wantsToQuitMatch:(nonnull GKTurnBasedMatch *)match



#pragma mark - challenges (GKLocalPlayerListener)
//untested, I don't use challenges
-(void)player:(GKPlayer *)player issuedChallengeWasCompleted:(GKChallenge *)challenge byFriend:(GKPlayer *)friendPlayer

//untested, I don't use challenges
-(void)player:(GKPlayer *)player didCompleteChallenge:(GKChallenge *)challenge issuedByFriend:(GKPlayer *)friendPlayer

//untested, I don't use challenges
-(void)player:(GKPlayer *)player didReceiveChallenge:(GKChallenge *)challenge

//untested, I don't use challenges
-(void)player:(GKPlayer *)player wantsToPlayChallenge:(GKChallenge *)challenge



#pragma mark - exchanges (GKLocalPlayerListener)
//seems to work as expected
-(void)player:(GKPlayer *)player receivedExchangeCancellation:(GKTurnBasedExchange *)exchange forMatch:(GKTurnBasedMatch *)match

//this fires for the Current Player AND the Exchange Initiator AFTER all replies/timeouts are complete.
-(void)player:(GKPlayer *)player receivedExchangeReplies:(NSArray *)replies forCompletedExchange:(GKTurnBasedExchange *)exchange forMatch:(GKTurnBasedMatch *)match

//seems to work as expected
-(void)player:(GKPlayer *)player receivedExchangeRequest:(GKTurnBasedExchange *)exchange forMatch:(GKTurnBasedMatch *)match



#pragma mark - event handler (GKLocalPlayerListener)
-(void)player:(GKPlayer *)player receivedTurnEventForMatch:(GKTurnBasedMatch *)match didBecomeActive:(BOOL)didBecomeActive
/*
    Apple says this fires when:
    1. When it becomes the active player's turn, including the inviting player creating a new match (CHECK)
    2. When the time out is about to fire (FAIL. It fires AFTER the timeout expires, which may just be item #4 happening)
    3. Player accepts an invite from another player (FAIL. Never happens. Instead it fires when an INVITED player starts playing a session FROM this player.)
    4. Turn was passed to another player. (CHECK)
    5. player receives a reminder (CHECK, confirmed by μ4ρκ05)

    It Also fires when:
    6. A remote user quits (CHECK)
    7. A remote user declines (unconfirmed)
    8. An automatch player joins the game (CHECK)
    9. An invited player starts playing (CHECK)
    10. A remote user saves the game (CHECK)
*/

Редактировать: обновлен статус уведомлений-напоминаний на основе отзывов μ4ρκ05.

Хорошо, ваш список и объяснение различных методов заставили меня задуматься. Прежде всего. Проблема получения уведомлений при получении совпадения является для меня одной из самых острых проблем, поскольку, если вы не получите уведомление, это означает, что вам нужно будет получить доступ к данным. Итак, когда вы снова загружаете спички? Каждые x секунд или каждый раз, когда появляется контроллер вида со списком игр? Оба будут выдавать ненужные сетевые вызовы, что будет раздражать, а также, поскольку список игр, возможно, придется перезагрузить, без каких-либо реальных изменений, он может выглядеть не очень хорошо. Поэтому сначала я думал об использовании обменов, чтобы противник мог получать уведомления и перезагружать игры. Однако, читая твой пост, я вспомнил о player receives a reminder (UNTESTED) что называется receivedTurnEventForMatch, Теперь мне удалось уведомить оппонента о новой игре, инициализировав новую игру, сделав ход, а затем отправив напоминание.

Я обновил свой проект TurnBasedSkeleton.

У меня нет достаточно высокой репутации, чтобы комментировать ответ Thunks, но я могу представить свою собственную, так что именно так я получу эту информацию там. Самая большая часть проблемы заключается в том, что нет примеров того, как использовать этот код, и отсутствует документация. Таким образом, код не запускается, не является доказательством того, что код не работает, просто мы не знаем, как его использовать.

Но, основываясь на заявлениях, сделанных Thunk, я смог получить player: didModifySavedGame и player: hasConflictingSavedGames, которые, по его словам, никогда не видели, чтобы они стреляли.

Это методы к безумию GKSavedGameListener. проблема с этим протоколом заключается в том, что у него нет делегата для его назначения, поэтому я могу выбрать любой класс в моей программе и настроить его на соответствие этому протоколу, а затем ожидать срабатывания методов, что кажется маловероятным. Поэтому мне нужен был какой-то делегат, чтобы сказать, какой класс соответствует.

Я обнаружил, что установив localPlayer.registerListener(self), где self является соответствующим классом, я получаю их уволить.

Поэтому дважды проверьте все методы, которые не запускаются с этим набором, и дайте нам знать, работает ли он лучше.

Мое решение заключалось в том, чтобы продолжать проверку, постоянно получая совпадения из Game Center, используя GKTurnBasedMatch.loadMatches(completionHandler:). Чтобы проверить наличие приглашений, я просто смотрю, есть ли новые совпадения, у которых есть участник со статусом.invitedи участник, который активен, но не местный игрок. Если есть, игрок получает уведомление. Все это делается в фоновом потоке.

Надеюсь это поможет.

Вы ничего не пропускаете. Apple выбрала

удалить [эти] функции [s]

Я открыл сообщение об ошибке в Apple, чтобы продолжить расследование. Их ответ был, по меньшей мере, неудовлетворительным.

Отчет об ошибках Apple

Другие вопросы по тегам