我正在尝试使用[[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:]在GameKit中进行本地配对。本质上,我正在尝试实现无界面的本地比赛:只要我附近有一个球员,我就想连接并开始比赛。重要的是,我希望为本地玩家做到这一点:我从不希望通过互联网自动匹配。

我已在iTunes Connect中为我的应用启用了Game Center,并在我要测试的每台设备上注册了一个不同的沙箱帐户。

我尝试过使用GKMatchmakerViewController进行配对(在对本地播放器进行身份验证之后)和使用startBrowsingForNearbyPlayersWithReachableHandler:进行编程式配对,都在iPhone 4和第4代iPod Touch上并排坐在我的 table 上运行相同的代码。双方都找不到。使用GKMatchmakerViewController时,用于查找附近玩家的界面仍保留在



微调器,使用startBrowsingForNearbyPlayersWithReachableHandler:时,永远不会调用通知块。

这是我当前的测试代码块:

-(void)connectLocal
{
    if( ![GKLocalPlayer localPlayer].isAuthenticated )
    {
        // authenticateLocalPlayer calls connectLocal again after authentication is complete
        [ self authenticateLocalPlayer ];
        return;
    }
    [[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:^(NSString *playerID, BOOL reachable) {
             NSLog(@"Reachability changed for player %@", playerID );
        } ];
}

这些文档在主题上有些稀疏和困惑,尤其是当涉及本地多人播放器和互联网上的比赛之间的区别时。例如,在找到要加入该比赛的球员之前,似乎有必要对本地球员进行身份验证并创建比赛(Creating Any Kind of Match Starts with a Match Request)。但是this little nugget似乎建议其他方式:



另外,在Searching For Nearby Players中描述的流程中,在通过传递给startBrowsingForNearbyPlayersWithReachableHandler:的通知块找到玩家之后,直到第3步才创建比赛请求。不幸的是,我还没走那么远。

因此,问题是:

1)我认为我可以在对本地播放器进行身份验证之前先调用startBrowsingForNearbyPlayersWithReachableHandler:吗? GameKit不会引发错误,因此我假设它没问题。这可能是轻率的假设。我是否进行身份验证似乎并没有多大区别。

2)是否有人成功使用[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:实现了本地自动匹配?哪里有很好的示例代码来说明完整的流程,从浏览球员到比赛开始,全部都以编程方式进行?

3)关于是否可以在iOS Simulator中测试启用GameKit的应用程序,网络上似乎存在矛盾的报告。似乎没有普遍的共识,最好在iOS硬件上进行测试。我一直在使用iPhone 4和第四代iPod Touch。对于那些已经成功测试了本地多人游戏的人,您使用了哪种测试设置和方法?

最佳答案

您需要按以下顺序执行这些操作:

  • 验证本地播放器
  • 安装邀请处理程序
  • 开始浏览附近的玩家

  • 需要身份验证-这会在Game Center中注册您的应用并登录玩家。在大多数情况下,您甚至都不需要Internet即可执行此操作。

    还需要安装邀请处理程序,我认为这是您所缺少的步骤。这使您的应用程序知道收到入站​​邀请时该怎么办。如果您不这样做,则设备不会注册为附近的设备。

    完成以上两个操作后,才开始浏览。

    这是一些示例代码,可以助您一臂之力。应用启动后调用此方法:
    - (void) authenticateLocalPlayer
    {
    
        static BOOL gcAuthenticationCalled = NO;
        if (!gcAuthenticationCalled) {
            GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
    
            void (^authenticationHandler)(UIViewController*, NSError*) = ^(UIViewController *viewController, NSError *error) {
                NSLog(@"Authenticating with Game Center.");
                GKLocalPlayer *myLocalPlayer = [GKLocalPlayer localPlayer];
                if (viewController != nil)
                {
                    NSLog(@"Not authenticated - storing view controller.");
                    self.authenticationController = viewController;
                }
                else if ([myLocalPlayer isAuthenticated])
                {
                    NSLog(@"Player is authenticated!");
    
                    //iOS8 - register as a listener
                    [localPlayer unregisterAllListeners];
                    [localPlayer registerListener:self];
    
                    [[GKLocalPlayer localPlayer] loadFriendPlayersWithCompletionHandler:^(NSArray *friendPlayers, NSError *error) {
    
                        //Do something with the friends
    
                    }];
    
                    //iOS7 - install an invitation handler
                    [GKMatchmaker sharedMatchmaker].inviteHandler = ^(GKInvite *acceptedInvite, NSArray *playersToInvite) {
                        // Insert game-specific code here to clean up any game in progress.
                        if (acceptedInvite)
                        {
                            //This player accepted an invitation.
                            //If doing programmatic matchmaking, call GKMatchmaker's matchForInvite:completionHandler
                            //to get a match for the invite.  Otherwise you need to allocate a GKMatchmakerViewController
                            //instance and present it with the invite.
    
                        }
                        else if (playersToInvite)
                        {
                            //Your game was launched from the GameCenter app to host a match.
                        }
                    };
    
                    //Now you can browse.  Note this is the iOS8 call.  The iOS7 call is slightly different.
                    [[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithHandler:^(GKPlayer *player, BOOL reachable) {
    
                        NSLog(@"Player Nearby: %@", player.playerID);
    
                    }];
    
    
    
                }
                else
                {
                    //Authentication failed.
                    self.authenticationController = nil;
                    if (error) {
                        NSLog([error description], nil);
                    }
                }
    
    
            };
    
            localPlayer.authenticateHandler = authenticationHandler;
            gcAuthenticationCalled = YES;
        }
    }
    

    *重要*
    如果您使用的是iOS8,则无需安装邀请处理程序。您可以将一个对象注册为监听协议(protocol)GKLocalPlayerListener,并实现以下方法:
    -player:didAcceptInvite:
    -player:didRequestMatchWithRecipients:
    

    如果您未在iOS8上实现这些方法,它将无法正常工作!

    然后,通过在验证本地播放器后调用此链接,可以将GKMatchmaker链接到该对象:
    [localPlayer registerListener:self];
    

    确保在.h文件中像这样声明了实现协议(protocol)的对象:
    @interface MyImplementingObject : NSObject <GKMatchDelegate, GKLocalPlayerListener>
    

    如果您执行了所有这些操作后仍然无法使用,请确保已在应用程序中正确设置了捆绑软件ID(单击应用程序,单击“目标”,确保已填写捆绑软件标识符和版本),然后单击单击“功能”选项卡(XCode 6),并确保打开了Game Center。

    转到成员(member)中心,并确保使用该捆绑包ID的应用程序还为其配给配置文件启用了Game Center。如有必要,下载并重新应用您的配置文件。

    确保在GameCenter下的“设置”中将沙箱开关打开,并确保将“允许邀请”和“附近的玩家”开关打开。

    最后,确保您转到iTunes Connect并确认那里的应用程序也启用了Game Center。

    关于ios - 一些startBrowsingForNearbyPlayersWithReachableHandler问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18108446/

    10-13 02:32