我正在尝试使用[[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/