一些开始浏览对附近的玩家有可接触的问题

我试图使用[[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:]在GameKit中使用本地匹配工作。 基本上,我试图实现无界面的本地匹配:只要在我附近有一个玩家,我想连接并开始比赛。 重要的是,我只想为本地玩家这样做:我从来不想通过互联网自动匹配。

我已经在iTunes连接中为我的应用程序启用了Game Center,并在我用来testing的每台设备上注册了不同的沙盒帐户。

我已经尝试了与GKMatchmakerViewController (authentication本地播放器之后)以及与startBrowsingForNearbyPlayersWithReachableHandler:编程匹配的匹配startBrowsingForNearbyPlayersWithReachableHandler:在iPhone 4上运行相同的代码,并在桌面上彼此相邻的第4代iPod Touch上运行相同的代码。 没有find对方; 当使用GKMatchmakerViewController ,用于查找附近玩家的界面仍然在

寻找玩家…

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

这是我目前的testing代码块:

 -(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 ); } ]; } 

关于这个问题,文档有点稀疏和困惑,特别是当涉及到互联网上的本地多人游戏和火柴人之间的区别时。 例如,似乎有必要validation本地玩家,并在find玩家join该匹配之前创build一个匹配( 创build任何种类的匹配以匹配请求开始 )。 然而, 这个小块似乎另有build议:

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

此外,在“ search附近玩家”中描述的stream程中, 通过传递给startBrowsingForNearbyPlayersWithReachableHandler:的通知块查找玩家之后步骤3之前不会创build匹配请求。 不幸的是,我从来没有这么远。

所以,问题是:

1)我是否认为我可以调用startBrowsingForNearbyPlayersWithReachableHandler:在authentication本地播放器之前? GameKit不会抛出错误,所以我假设它没问题。 这可能是一个轻率的假设。 我是否authentication似乎没有太大的区别。

2)有没有人使用[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:成功实现本地自动匹配[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler: ? 是否有很好的示例代码来说明从浏览玩家到开始比赛的完整stream程?

3)在iOS模拟器中是否可以testing启用了GameKit的应用程序,networking上的报告似乎有冲突。 普遍的共识似乎没有,最好在iOS硬件上testing。 我一直在使用iPhone 4和第四代iPod Touch。 对于已经成功testing本地多人游戏的玩家,您使用了哪些testing设置和方法?

你需要按照这个顺序做这些事情:

  1. validation本地播放器
  2. 安装邀请处理程序
  3. 开始浏览附近的玩家

身份validation是必需的 – 这将注册您的应用程序与游戏中心和login玩家在大多数情况下,你甚至不需要互联网接入这样做。

安装邀请处理程序也是必需的,我认为这是你错过的一步。 这可以让您的应用程序知道收到入站​​邀请时要执行的操作。 如果您不这样做,设备将不会注册为附近。

只有在完成上述两项后才能开始浏览。

以下是一些示例代码,以帮助您解决问题。 应用程序启动后调用此方法:

 - (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,然后实现这些方法:

 -player:didAcceptInvite: -player:didRequestMatchWithRecipients: 

如果你没有在iOS8上实现这些方法,它将无法工作!

然后在authentication本地播放器之后,通过调用GKMatchmaker到该对象:

 [localPlayer registerListener:self]; 

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

 @interface MyImplementingObject : NSObject <GKMatchDelegate, GKLocalPlayerListener> 

如果你做了这一切,但仍然无法正常工作,请确保你的应用程序已经正确设置了你的包ID(点击应用程序,点击“Targets”,确保Bundle Identifier和Version已经填入),然后点击“function”选项卡(XCode 6),并确保Game Center处于打开状态。

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

确保在GameCenter下的设置中沙盒开关已打开,同时确保“允许邀请”和“附近玩家”开关打开。

最后,请确保您进入iTunes Connect,并validation您的应用是否已启用Game Center。

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

不, startBrowsingForNearbyPlayersWithReachableHandler通过广告现有的玩家和浏览其他玩家的作品,但最重要的是,它用来识别玩家的信息是玩家playerID …在玩家身份validation之前将不可用。

3)在iOS模拟器中是否可以testing启用了GameKit的应用程序,networking上的报告似乎有冲突。 普遍的共识似乎没有,最好在iOS硬件上testing

GameCenter身份validation,成就和排行榜在模拟器中工作,其他一切都应在真实的硬件上testing。 实际上,我推荐使用模拟器进行authenticationtesting,因为它避免了可以在设备上进行详细的authenticationtesting的沙箱/生产交换机。 其他一切只能在设备上进行testing。 模拟器没有很好的支持接收推送通知,中断匹配设置和一般的硬件configuration是不够的,匹配通信不太可能正常工作。

所以,请记住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服务有一些延迟,这个机制很好。 但是,需要适当调用:

 [[GKMatchmaker sharedMatchmaker] stopBrowsingForNearbyPlayers]; 

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