Обработчик приглашений GKMatchMaker устарел

У меня есть следующий код, который я использовал раньше для обработки приглашений:

[GKMatchmaker sharedMatchmaker].inviteHandler = ^(GKInvite *acceptedInvite, NSArray *playersToInvite) {
    // Insert game-specific code here to clean up any game in progress.
    if (acceptedInvite) {
        GKMatchmakerViewController *mmvc = [[GKMatchmakerViewController alloc] initWithInvite:acceptedInvite];
        mmvc.matchmakerDelegate = self;
        [self presentViewController:mmvc animated:YES completion:nil];
    }
};

Однако теперь он устарел в iOS 7. Где и как зарегистрировать обработчик приглашений GameKit в моем проекте?


person Community    schedule 13.12.2013    source источник


Ответы (4)


GKInviteEventHandler и, в частности, взгляните на GKLocalPlayerListener.

Соблюдайте протокол GKLocalPlayerListener, и все будет в порядке. Ниже приведены методы протокола, которые кажутся предполагаемой заменой для обработчика приглашений, но разделены на две части.

- (void)player:(GKPlayer *)player didAcceptInvite:(GKInvite *)invite
- (void)player:(GKPlayer *)player didRequestMatchWithPlayers:(NSArray *)playerIDsToInvite

После того, как вы настроили какой-либо объект, чтобы он соответствовал этому, вы просто вызываете registerListener:.

[[GKLocalPlayer localPlayer] registerListener:yourObjectHere]

Не беспокойтесь о регистрации как можно скорее, так как система кэширует приглашения/вызовы/пошаговые вещи, если нет никого, кто мог бы их обработать, и сообщает вашему слушателю, как только вы его настроите.

person Andrew    schedule 13.12.2013

Как говорит Сэм, новый способ сделать это — использовать протокол GKLocalPlayerListener. Сейчас подход обратный. В прошлом вы отправляли приглашения другим игрокам из части вашего приложения. Другая часть выслушала приглашение от другого игрока и ответила на него. Теперь вы используете matchMakerViewController или Game Center для отправки приглашений (как и раньше), но теперь вы ожидаете принятия этих приглашений. После этого Game Center вызывает didFindMatch, чтобы все началось. Если вы получили приглашение, Game Center запустит вашу игру, а затем вызовет didFindMatch для ее запуска.

Это мой код:

В моем файле .h протокол GKLocalPlayerListener:

@interface MNFStartupViewController : UIViewController<ADBannerViewDelegate, GKMatchmakerViewControllerDelegate, GKMatchDelegate, GKLocalPlayerListener, UIAlertViewDelegate>

в файле .m в моем блоке authenticationHandler после аутентификации локального игрока:

[[GKLocalPlayer localPlayer] registerListener:self];

Затем метод прослушивания принятия приглашения:

-(void)player:(GKPlayer *)player didAcceptInvite:(GKInvite *)invite{
//Called when another player accepts a match invite from the local player.
NSLog(@"didAcceptInvite was called: Player: %@  accepted our invitation", player);
GKMatchmakerViewController *mmvc = [[GKMatchmakerViewController alloc] initWithInvite:invite];
mmvc.matchmakerDelegate = self;
[self presentViewController:mmvc animated:YES completion:nil];}

Теперь способ запустить игру из Game Center с набором игроков, выбранным в Game Center. Это сложно отладить, потому что вы не можете запустить игру в Game Center, одновременно запуская ее из Xcode (я так не думаю!), поэтому есть отладочный AlertView, который можно удалить.

-(void)player:(GKPlayer *)player didRequestMatchWithPlayers:(NSArray *)playerIDsToInvite{
//Called when the local player starts a match with another player from Game Center
//Start of debugging logging and alerting
NSLog(@"In didRequestMatchWithPlayers for players: %@", playerIDsToInvite);
NSString *logString = [[NSString alloc] initWithFormat:@"didrequestMatchWithPlayers was called with player IDs: %@", playerIDsToInvite];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Logging Alert" message:logString delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
//End of debugging logging and alerting
//Create a match for the chosen players
GKMatchRequest *match = [[GKMatchRequest alloc]init];
match.playersToInvite = playerIDsToInvite;
//Create a matchmaking viewcontroller for that match
GKMatchmakerViewController *mmvc = [[GKMatchmakerViewController alloc]initWithMatchRequest:match];
mmvc.matchmakerDelegate = self;
[self presentViewController:mmvc animated:YES completion:nil];}

Это способ начать весь процесс подбора игроков:

-(IBAction)setupMatch:(id)sender{
GKMatchmakerViewController *matchViewController = [[GKMatchmakerViewController alloc] initWithMatchRequest:matchRequest];
matchViewController.matchmakerDelegate = self;
[self presentViewController:matchViewController animated:YES completion:nil];}

Наконец, это метод, вызываемый Game Center, чтобы начать матч, когда все игроки подключены и готовы к игре. currentPlayer, currentMatch и hostingPlayer — это мои собственные свойства с очевидным использованием.

-(void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *)match{
//Called when GameCenter completes the auto matchmaking process
match.delegate = (id)self;
[self setCurrentMatch:match];
[self setCurrentPlayers:match.playerIDs];
NSLog(@"Match was found with players: %@, time to get on with the game.", self.currentPlayers);
//Use the built in features to decide which device should be the server.
self.hostingPlayer = [self chooseHostingPlayerIDfromPlayerIDs:self.currentPlayers];
[self dismissViewControllerAnimated:YES completion:nil];}

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

person Tim    schedule 23.07.2014

Кроме того, инвайты работают только на устройствах. Я не мог получить приглашения для работы в симуляторе в iOS 8.1.

person Robert Wasmann    schedule 06.11.2014

Я считаю, что ответ, к сожалению, отличается для GKMatch и GKTurnBasedMatch.

Для GKTurnBasedMatch приглашение считается событием хода и обрабатывается следующей функцией:

player(_ player: GKPlayer, receivedTurnEventFor match: GKTurnBasedMatch, didBecomeActive: Bool)

Это внутри протокола GKLocalPlayerListener. Чтобы это работало, у вас должен быть официально зарегистрирован экземпляр GKLocalPlayerListener в вашем локальном плеере, поэтому вы можете сделать это только после аутентификации.

...и это не всегда работает. Game Center ненадежен. Но иногда это работает, и это... что-то?

person Le Mot Juiced    schedule 11.03.2017