Что делать с приглашениями в игровой центр, если друг не продвинулся в приложении достаточно далеко, чтобы добраться до метода installInvitationHandler?

Я создаю матчи в реальном времени и не понимаю, как поступить с приглашениями на игру? Например, игрок на одном устройстве может пригласить своих друзей на матч, и тогда на устройствах друзей появится баннер с приглашением. Они могут нажать на баннер и принять приглашение. Теперь это отлично работает, если друг запускал приложение раньше и установил указанный ниже обработчик приглашений (установлен во втором контроллере представления приложения).

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

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


person Nosrettap    schedule 22.01.2013    source источник
comment
Когда приложение запускается через уведомление игрового центра, нельзя ли тогда просто запустить метод installInvitationHandler?   -  person Chris Truman    schedule 23.01.2013
comment
Тогда я не знаю, где взять GKInvite?   -  person Nosrettap    schedule 23.01.2013
comment
Разве он не будет передан в методе launchWithOptions вашего AppDelegate? В Apple Docs говорится, что для получения приглашений от других игроков в вашей игре должен быть предусмотрен обработчик приглашений. Можете ли вы даже получить приглашения на push-уведомления до того, как настроите обработчик приглашений?   -  person Chris Truman    schedule 23.01.2013
comment
Я провел некоторое тестирование, и словарь в методе параметров запуска равен нулю. Кроме того, да, вы можете получать приглашения до того, как настроите обработчик приглашений.   -  person Nosrettap    schedule 23.01.2013
comment
Изучив документы GameKit, кажется, что Apple не предоставляет возможности ответить на приглашение, которое происходит после установки приложения, но не достигло момента, когда вы регистрируете инвайтхандлер. Я думаю, вы просто проигнорируете это приглашение, и пользователю придется снова пригласить игрока.   -  person Chris Truman    schedule 23.01.2013
comment
возможный дубликат обработчика приглашений Game Center, где он?   -  person Drux    schedule 25.03.2014


Ответы (2)


Вы должны добавить обработчик приглашений сразу после запуска вашего приложения. Объект GKInvite передается при вызове обработчика.

[GKMatchmaker sharedMatchmaker].inviteHandler = ^(GKInvite *acceptedInvite, NSArray *playersToInvite) {
    //By the time this block is called, you have already received the
    //invite, it's passed as a parameter
    if (acceptedInvite) {
        //This is your invite
    } else if (playersToInvite) {
        //The player has launched your app from the Game Center app, invite these players.
    }
};
person daltonclaybrook    schedule 03.04.2013

Я считаю, что лучше всего присоединить обработчик приглашений в качестве блока завершения к обработчику аутентификации GKLocalPlayer.

Это для iOS 6.0 и выше...

[GKLocalPlayer localPlayer].authenticateHandler = ^(UIViewController *viewController,     NSError *error)
    {
        if([GKLocalPlayer localPlayer].authenticated)
            _gameCenterFeaturesEnabled = YES;

        // Present the view controller if needed
        if (![GKLocalPlayer localPlayer].authenticated)
        {
            if(viewController)
                [self presentViewController:viewController];
            return;
        }

        if (error)
        {
            if(completionHandler)
                completionHandler(error);
        }
        else
        {
            [self authenticationCompleted];
            if(completionHandler)
                completionHandler(nil);
        }
    };

С обработчиком завершения...

if(!error)
    {           
        CCLOG(@"Adding invite handler.");
        [GKMatchmaker sharedMatchmaker].inviteHandler = ^(GKInvite *acceptedInvite, NSArray *playersToInvite) {
            CCLOG(@"Invite recieved.");
            // Insert game-specific code here to clean up any game in progress.
            if (acceptedInvite)
            {
                GKMatchmakerViewController *mmvc = [[GameDataCache sharedData].match createWithInvite:acceptedInvite];
                mmvc.matchmakerDelegate = [GameDataCache sharedData].match;
            }
            else if (playersToInvite)
            {
                GKMatchRequest *request = [[GKMatchRequest alloc] init];
                request.minPlayers = 2;
                request.maxPlayers = 2;
                request.playersToInvite = playersToInvite;

                GKMatchmakerViewController *mmvc = [[GameDataCache sharedData].match createNewRequest:request cancelledBlock:nil];
                mmvc.matchmakerDelegate = [GameDataCache sharedData].match;
            }
        };
    }

Pre iOS6 должен вызывать authenticationWithCompletionHandler для localPlayer вместо того, чтобы назначать свойство authenticationHandler.

person aronspring    schedule 12.08.2013
comment
Примечание. ПриглашениеHandler теперь устарело (начиная с iOS 7). См. этот вопрос SO stackoverflow.com/questions/20567104/ - person thomers; 29.09.2015