首页 文章

一些startBrowsingForNearbyPlayersWithReachableHandler问题

提问于
浏览
5

我正在尝试使用 [[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:] 在GameKit中进行本地匹配 . 基本上,我是当地附近的一名球员,我想连接并开始比赛 . 重要的是,我想为本地玩家做这件事:我想通过互联网自动匹配.1717704_

我在iTunes iTunes中为我的应用启用了Game Center,并在我用来测试的每台设备上注册了一个不同的沙盒帐户 .

我已经尝试了与 GKMatchmakerViewController (在验证本地播放器之后)和与 startBrowsingForNearbyPlayersWithReachableHandler: 进行程序化匹配的两个匹配,在我的桌面上彼此相邻的iPhone 4和第四代iPod Touch上运行相同的代码 . 都没有找到另一个;当使用 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似乎暗示:

标准用户界面允许玩家发现附近的其他玩家,即使这两个玩家当前都没有直接连接到Game Center .

另外,在Searching For Nearby Players中描述的流程中,在通过传递给 startBrowsingForNearbyPlayersWithReachableHandler: 的通知块找到玩家之后,直到步骤3才创建匹配请求 . 不幸的是,我从来没有这么远 .

所以,问题:

1)我认为我可以在验证本地播放器之前调用 startBrowsingForNearbyPlayersWithReachableHandler: 吗? GameKit并没有假设's OK. This may be a rash assumption. Whether I authenticate or not doesn'似乎有很大的不同 .

2)有没有人使用 [GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler: 成功实现了本地自动匹配?是否有好的示例代码可以说明完整的流程,从浏览播放器到开始匹配,都是以编程方式进行的?

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

3 回答

  • 1

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

    • 验证本地播放器

    • 安装邀请处理程序

    • 开始浏览附近的玩家

    需要身份验证 - 这会将您的应用程序注册到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;
        }
    }
    

    *** IMPORTANT *** 如果您're using iOS8, you don' t安装邀请处理程序 . 您改为将对象注册为侦听协议GKLocalPlayerListener,并实现以下方法:

    -player:didAcceptInvite:
    -player:didRequestMatchWithRecipients:
    

    If you don't implement these methods on iOS8, it won't work!

    然后,在验证本地播放器后通过调用此链接将GKMatchmaker链接到该对象:

    [localPlayer registerListener:self];
    

    确保在.h文件中声明实现协议的对象:

    @interface MyImplementingObject : NSObject <GKMatchDelegate, GKLocalPlayerListener>
    

    如果您执行了所有操作但仍然无法正常工作,请确保在应用程序中正确设置了包ID(单击应用程序,单击“目标”,确保填写“包标识符和版本”),然后单击“ “功能”选项卡(XCode 6),并确保游戏中心已启用 .

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

    确保GameCenter下的“设置”中的沙盒开关已打开,并确保“允许邀请”和“附近播放器”开关已打开 .

    最后,确保您转到iTunes Connect并验证是否已为您的应用启用了Game Center .

  • 2

    1)我是否正确地认为我可以调用startBrowsingForNearbyPlayersWithReachableHandler:在验证本地播放器之前?

    没有 startBrowsingForNearbyPlayersWithReachableHandler 通过宣传现有玩家和浏览其他玩家的方式工作,但最重要的是,它用于识别玩家的信息是 playerID ......在玩家进行身份验证之前不可用 .

    3)网上似乎有关于是否可以在iOS模拟器中测试启用GameKit的应用程序的报告存在冲突 . 普遍的共识似乎没有,并且最好在iOS硬件上进行测试

    GameCenter身份验证,成就和排行榜在模拟器中工作,其他一切都应该在真实硬件上进行测试 . 我实际上推荐用于身份验证测试的模拟器,因为它避免了沙盒/ 生产环境 开关,它可以在设备上进行详细的验证测试有点令人困惑 . 其他所有东西只能在设备上测试 . 模拟器不能很好地支持接收推送通知,这会打破匹配设置,并且通用硬件配置不同,无论如何都不能正常工作 .

  • 1

    所以,请记住iOS7和iOS8之间的差异 . 此代码适用于任一版本,并依次调用'updateNearbyPlayer' .

    if ( IS_IOS8 )
    {
        [[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithHandler:^(GKPlayer *gkPlayer, BOOL reachable) 
         {
             NSLog(@"PLAYER ID %@ is %@",gkPlayer.playerID,reachable?@"reachable" : @"not reachable");
             [self updateNearbyPlayer:gkPlayer reachable:reachable];
         }];
    
    } else {
        /*
         *  iOS 7...
         */
        [[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:^(NSString *playerID, BOOL reachable) 
         {
             NSLog(@"PLAYER ID %@ is %@",playerID,reachable?@"reachable" : @"not reachable");
    
             [GKPlayer loadPlayersForIdentifiers:@[playerID] withCompletionHandler:^(NSArray *players, NSError *error) {
                 NSLog(@"Loaded: %@, error= %@",players,error);
                 GKPlayer *gkPlayer = [players objectAtIndex:0];
                 [self updateNearbyPlayer:gkPlayer reachable:reachable];
             }];
         }];
    }
    

    由于潜在的Bonjour服务有一些延迟,这种机制很有效 . 但是,需要通过适当的调用来 balancer :

    [[GKMatchmaker sharedMatchmaker] stopBrowsingForNearbyPlayers];
    

    每当您使用其中一个报告的GKPlayers / PlayerID Build 匹配项或将其添加到现有匹配项时,您应该停止浏览 . 比赛完成,关闭或取消后,再次开始浏览 . 否则,在第二次尝试连接到附近的设备时,您将失败 .

相关问题