我正试图让本地的婚介在GameKit中使用[[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:]。本质上,我试图实现界面少的本地匹配:只要在我的本地附近有一个播放器,我想连接并启动一个匹配。重要的是,我只想为本地玩家做这件事:我从不想要在互联网上自动匹配。
我在iTunes连接中为我的应用程序启用了游戏中心,并在我用来测试的每个设备上注册了一个不同的沙箱帐户。
我已经尝试过与GKMatchmakerViewController进行匹配(在验证本地播放器之后),也尝试过与startBrowsingForNearbyPlayersWithReachableHandler:进行编程匹配,在iPhone 4和第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 );
} ];
}文档在这个主题上有点稀疏和混乱,特别是当涉及到本地多媒体播放器和互联网上的匹配之间的区别时。例如,在找到要加入该匹配的球员(创建任何类型的匹配都从匹配请求开始。)之前,似乎有必要对本地玩家进行身份验证并创建一个匹配。然而,这个小块似乎不这么认为:
标准用户界面允许玩家发现附近的其他玩家,即使双方目前都没有直接连接到游戏中心。
此外,在寻找附近的玩家中描述的流中,在通过传递给startBrowsingForNearbyPlayersWithReachableHandler:的通知块找到播放器之后,直到第3步才创建匹配请求。不幸的是,我还没走那么远。
所以,问题是:
1)在对本地玩家进行身份验证之前,我是否正确地认为我可以打电话给startBrowsingForNearbyPlayersWithReachableHandler:?GameKit不会抛出错误,所以我假设它是可以的。这可能是一个草率的假设。我认证与否似乎没什么区别。
( 2)是否有人使用[GKMatchmaker sharedMatchmaker] startBrowsingForNearbyPlayersWithReachableHandler:成功地实现了本地自动匹配?是否有很好的示例代码说明了完整的流程,从浏览球员到开始比赛,都是以编程方式进行的?
3)对于支持GameKit的应用程序是否可以在iOS模拟器中进行测试,网络上似乎有相互矛盾的报道。一般的共识似乎不是,最好在iOS硬件上进行测试。我一直在使用iPhone 4&第4代iPod Touch。对于那些已经成功测试本地多人游戏的人,您使用了什么测试设置和方法?
发布于 2014-10-07 04:26:59
你需要按照以下顺序来做这些事情:
认证是必需的-这注册您的应用程序与游戏中心和登录的播放器。在大多数情况下,你甚至不需要上网就能做到这一点。
安装邀请处理程序也是必需的,我认为这是您缺少的步骤。这让你的应用程序知道当收到入站邀请时该怎么做。如果你不这样做,一个设备将不会注册为在附近。
只在完成上述两项操作后才开始浏览。
下面是一些示例代码,可以让您开始工作。在应用程序启动后调用此方法:
- (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上实现这些方法,它将无法工作!
然后,在对本地播放器进行身份验证之后,通过调用它将GKMatchmaker链接到该对象:
[localPlayer registerListener:self];确保实现协议的对象在.h文件中声明如下:
@interface MyImplementingObject : NSObject <GKMatchDelegate, GKLocalPlayerListener>如果您这样做,但它仍然不工作,请确保您的捆绑ID设置正确在您的应用程序(点击应用程序,点击‘目标’,确保捆绑标识符和版本已填写),然后单击‘功能’选项卡(XCode 6),并确保游戏中心是打开的。
转到成员中心,确保使用该捆绑ID的应用程序也为其配置文件启用了游戏中心。如有必要,请下载并重新应用您的配置文件。
确保沙箱开关是在您的设置在GameCenter下,并确保‘允许邀请’和‘附近的球员’开关是打开的。
最后,确保您进入iTunes连接并验证游戏中心是否已为您的应用程序启用。
发布于 2014-06-25 22:53:16
1)在对本地玩家进行身份验证之前,我是否正确地认为我可以打电话给startBrowsingForNearbyPlayersWithReachableHandler:?
不是的。startBrowsingForNearbyPlayersWithReachableHandler通过为现有播放器做广告和浏览其他播放器来工作,但最重要的是,它用来识别玩家的信息是playerID.在玩家验证之前是不可用的。
3)对于支持GameKit的应用程序是否可以在iOS模拟器中进行测试,网络上似乎有相互矛盾的报道。一般的共识似乎不是,最好在iOS硬件上进行测试。
GameCenter身份验证、成绩和领导板在模拟器中工作,其他的一切都应该在真正的硬件上进行测试。我实际上推荐了用于身份验证测试的模拟器,因为它避免了沙箱/生产开关,这可能会使设备上的详细测试变得有些混乱。其他一切都只能在设备上进行测试。模拟器对于接收破坏匹配设置的推送通知没有很好的支持,而且一般的硬件配置有足够的不同,因此匹配通信无论如何都不太可能正常工作。
发布于 2014-10-09 21:31:45
因此,请记住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之一建立匹配或将其添加到现有匹配时,就应该停止浏览。一旦比赛结束,关闭或取消,开始再次浏览。否则,在第二次尝试连接到附近的设备时,您将失败。
https://stackoverflow.com/questions/18108446
复制相似问题