首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一些问题

一些问题
EN

Stack Overflow用户
提问于 2013-08-07 16:15:23
回答 3查看 1.1K关注 0票数 5

我正试图让本地的婚介在GameKit中使用[[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:]。本质上,我试图实现界面少的本地匹配:只要在我的本地附近有一个播放器,我想连接并启动一个匹配。重要的是,我只想为本地玩家做这件事:我从不想要在互联网上自动匹配。

我在iTunes连接中为我的应用程序启用了游戏中心,并在我用来测试的每个设备上注册了一个不同的沙箱帐户。

我已经尝试过与GKMatchmakerViewController进行匹配(在验证本地播放器之后),也尝试过与startBrowsingForNearbyPlayersWithReachableHandler:进行编程匹配,在iPhone 4和第4代iPod Touch上运行相同的代码,它们坐在我的桌子上。两个都找不到另一个;当使用GKMatchmakerViewController时,用于查找附近玩家的接口仍然位于

寻找玩家..。

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

下面是我当前的测试代码:

代码语言:javascript
复制
-(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 );
        } ];
}

文档在这个主题上有点稀疏和混乱,特别是当涉及到本地多媒体播放器和互联网上的匹配之间的区别时。例如,在找到要加入该匹配的球员(创建任何类型的匹配都从匹配请求开始。)之前,似乎有必要对本地玩家进行身份验证并创建一个匹配。然而,这个小块似乎不这么认为:

标准用户界面允许玩家发现附近的其他玩家,即使双方目前都没有直接连接到游戏中心。

此外,在寻找附近的玩家中描述的流中,在通过传递给startBrowsingForNearbyPlayersWithReachableHandler:的通知块找到播放器之后,直到第3步才创建匹配请求。不幸的是,我还没走那么远。

所以,问题是:

1)在对本地玩家进行身份验证之前,我是否正确地认为我可以打电话给startBrowsingForNearbyPlayersWithReachableHandler:?GameKit不会抛出错误,所以我假设它是可以的。这可能是一个草率的假设。我认证与否似乎没什么区别。

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

3)对于支持GameKit的应用程序是否可以在iOS模拟器中进行测试,网络上似乎有相互矛盾的报道。一般的共识似乎不是,最好在iOS硬件上进行测试。我一直在使用iPhone 4&第4代iPod Touch。对于那些已经成功测试本地多人游戏的人,您使用了什么测试设置和方法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-07 04:26:59

你需要按照以下顺序来做这些事情:

  1. 验证本地玩家的身份
  2. 安装一个邀请处理程序
  3. 开始浏览附近的玩家

认证是必需的-这注册您的应用程序与游戏中心和登录的播放器。在大多数情况下,你甚至不需要上网就能做到这一点。

安装邀请处理程序也是必需的,我认为这是您缺少的步骤。这让你的应用程序知道当收到入站邀请时该怎么做。如果你不这样做,一个设备将不会注册为在附近。

只在完成上述两项操作后才开始浏览。

下面是一些示例代码,可以让您开始工作。在应用程序启动后调用此方法:

代码语言:javascript
复制
- (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,则不安装邀请处理程序。相反,您可以注册一个对象作为监听协议GKLocalPlayerListener,并实现以下方法:

代码语言:javascript
复制
-player:didAcceptInvite:
-player:didRequestMatchWithRecipients:

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

然后,在对本地播放器进行身份验证之后,通过调用它将GKMatchmaker链接到该对象:

代码语言:javascript
复制
[localPlayer registerListener:self];

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

代码语言:javascript
复制
@interface MyImplementingObject : NSObject <GKMatchDelegate, GKLocalPlayerListener>

如果您这样做,但它仍然不工作,请确保您的捆绑ID设置正确在您的应用程序(点击应用程序,点击‘目标’,确保捆绑标识符和版本已填写),然后单击‘功能’选项卡(XCode 6),并确保游戏中心是打开的。

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

确保沙箱开关是在您的设置在GameCenter下,并确保‘允许邀请’和‘附近的球员’开关是打开的。

最后,确保您进入iTunes连接并验证游戏中心是否已为您的应用程序启用。

票数 1
EN

Stack Overflow用户

发布于 2014-06-25 22:53:16

1)在对本地玩家进行身份验证之前,我是否正确地认为我可以打电话给startBrowsingForNearbyPlayersWithReachableHandler:?

不是的。startBrowsingForNearbyPlayersWithReachableHandler通过为现有播放器做广告和浏览其他播放器来工作,但最重要的是,它用来识别玩家的信息是playerID.在玩家验证之前是不可用的。

3)对于支持GameKit的应用程序是否可以在iOS模拟器中进行测试,网络上似乎有相互矛盾的报道。一般的共识似乎不是,最好在iOS硬件上进行测试。

GameCenter身份验证、成绩和领导板在模拟器中工作,其他的一切都应该在真正的硬件上进行测试。我实际上推荐了用于身份验证测试的模拟器,因为它避免了沙箱/生产开关,这可能会使设备上的详细测试变得有些混乱。其他一切都只能在设备上进行测试。模拟器对于接收破坏匹配设置的推送通知没有很好的支持,而且一般的硬件配置有足够的不同,因此匹配通信无论如何都不太可能正常工作。

票数 2
EN

Stack Overflow用户

发布于 2014-10-09 21:31:45

因此,请记住iOS7和iOS8之间的差异。这段代码将在任何一个版本上工作,然后依次调用'updateNearbyPlayer‘。

代码语言:javascript
复制
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服务的延迟,这种机制非常有效。然而,它需要与适当的呼吁相平衡,呼吁:

代码语言:javascript
复制
[[GKMatchmaker sharedMatchmaker] stopBrowsingForNearbyPlayers];

每当您使用报告的GKPlayers/PlayerID之一建立匹配或将其添加到现有匹配时,就应该停止浏览。一旦比赛结束,关闭或取消,开始再次浏览。否则,在第二次尝试连接到附近的设备时,您将失败。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18108446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档