Hge*_*geg 35 objective-c gamekit ios
我正在为iOS制作多人游戏,我在Apple开发者中心阅读了这个材料,特别是这个.这是我的自定义配对代码,非常简单:
- (void)findProgrammaticMatch {
GKMatchRequest *request = [[GKMatchRequest alloc] init];
request.minPlayers = 2;
request.maxPlayers = 2;
request.defaultNumberOfPlayers = 2;
request.playersToInvite = nil;
request.playerAttributes = 0;
request.playerGroup = 0;
UILabel *loading = (UILabel *)[aiw viewWithTag:792];
[[GKMatchmaker sharedMatchmaker] findMatchForRequest:request withCompletionHandler:^(GKMatch *match, NSError *error) {
if (error){
//error handling
[loaderLayer stopAnimating];
UIButton *cancelButton = (UIButton *)[loaderLayer viewWithTag:442];
[cancelButton setTitle:@"Go Back" forState:UIControlStateNormal];
loading.text = @"Cannot find any players. Please try again later.";
} else if (match != nil) {
//save match
self.match = match;
self.match.delegate = self;
loading.text = @"Found a player. Preparing session...";
if (!self.matchStarted && match.expectedPlayerCount == 0) {
self.matchStarted = YES;
//begin game logic
[self.scene setState:1];
self.myTicket = 1000+arc4random_uniform(999);
[self.scene send:self.myTicket];
[self stopLoading];
}
}
}];
}
Run Code Online (Sandbox Code Playgroud)
然而,当一个或多个设备通过蜂窝网络连接到互联网时,匹配失败.当我调查底层错误时,我发现即使它是wifi到wifi的情况下,完成处理程序也不能按预期工作.也就是说,match.expectedPlayerCount永远不会是0.相反,游戏- (void)match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state在完成处理程序之后调用处理程序时启动,如下所示:
...
- (void)match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state {
switch (state) {
case GKPlayerStateConnected:
self.matchStarted = YES;
//begin game logic
[self.scene setState:1];
self.myTicket = 1000+arc4random_uniform(999);
[self.scene send:self.myTicket];
[self stopLoading];
break;
...
Run Code Online (Sandbox Code Playgroud)
现在的问题是,如果连接3g的设备(并且匹配排序)didChangeState从不被调用.我在互联网和本网站上查了几个其他相关问题,虽然它们远非令人满意.我还读到Game Center的沙盒服务器不可靠,有些人生产版本工作得很好(它只是工作!)尽管沙盒模式有错误,但我不想冒这个风险.有没有人在他们的多人游戏中遇到过类似的问题?
赫格格,
你的代码没有任何问题。您必须允许您的应用程序使用蜂窝数据,这需要用户的许可。
以下段落摘自Apple的支持网站:
在基础层,您可以使用 NSMutableURLRequest 上的 setAllowsCellularAccess: 方法来指定是否可以通过蜂窝连接发送请求。您还可以使用 allowedCellularAccess 检查当前值。
在 Core Foundation 层,您可以通过在打开从 CFSocketStream 或 CFHTTPStream API 获取的流之前设置 kCFStreamPropertyNoCellular 属性来实现相同的效果。
在旧版本的 iOS 中,您可以继续使用 kSCNetworkReachabilityFlagsIsWWAN 作为确定流量是否通过蜂窝连接发送的最佳方式,但您应该了解其局限性。
祝你好运
伊曼
| 归档时间: |
|
| 查看次数: |
431 次 |
| 最近记录: |