7

我正在创建一个实时比赛游戏,但我对如何处理游戏邀请感到困惑?例如,一个设备上的玩家可以邀请他的朋友参加比赛,然后邀请横幅将出现在朋友的设备上。他们可以点击横幅并接受邀请。现在,如果朋友之前运行过该应用程序并安装了以下邀请处理程序(安装在应用程序的第二个视图控制器中),这将正常工作

- (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方法,我该怎么办? 如果发生这种情况,如果朋友点击邀请横幅,应用程序将打开,但不会接受邀请。

4

2 回答 2

1

您应该在应用启动后立即添加邀请处理程序。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.
    }
};
于 2013-04-03T21:02:05.970 回答
0

我发现最好将邀请处理程序作为完成块附加到 GKLocalPlayer 的 authenticateHandler。

这适用于 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 需要在 localPlayer 上调用 authenticateWithCompletionHandler 而不是分配 authenticateHandler 属性。

于 2013-08-12T15:04:03.097 回答