Tôi đang tạo trò chơi nhiều người chơi cho iOS và tôi đọc tài liệu trong Trung tâm dành cho nhà phát triển của Apple, cụ thể là this one. Đây là mã của tôi cho mai mối tùy chỉnh, đó là khá đơn giản:Đấu nối GameKit không thành công cho kết nối 3G
- (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];
}
}
}];
}
Tuy nhiên, mai mối không thành công khi một hoặc nhiều thiết bị được kết nối với Internet thông qua mạng di động. Khi tôi điều tra lỗi cơ bản tôi phát hiện ra rằng ngay cả khi nó là một wifi để wifi trường hợp, xử lý hoàn thành không hoạt động như dự định. Đó là, match.expectedPlayerCount
không bao giờ là 0. Thay vào đó, các trò chơi bắt đầu khi - (void)match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state
handler được gọi sau khi xử lý hoàn thành như sau:
...
- (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;
...
Các vấn đề bây giờ là nếu một thiết bị với 3g được kết nối (và phù hợp-loại) didChangeState
không bao giờ được gọi. Tôi đã kiểm tra một số câu hỏi liên quan khác trên internet và trang web này, mặc dù chúng không đạt yêu cầu. Tôi cũng đọc rằng các máy chủ sandbox của Game Center không đáng tin cậy và một số phiên bản sản xuất của mọi người hoạt động hoàn hảo (nó hoạt động!) Bất chấp lỗi trong chế độ sandbox, nhưng tôi không muốn chấp nhận rủi ro đó. Có ai đã gặp phải sự cố tương tự với trò chơi nhiều người chơi của họ không?
Chỉ cần có thông tin chi tiết nhanh. Máy chủ của bạn có mở internet hay bạn đang làm việc trên mạng LAN không? Tôi đoán nó là cái đầu tiên, nhưng nếu ai đó trả cho tôi một xu mỗi lần tôi có loại vấn đề cơ sở hạ tầng đơn giản mà không nhận thấy, tôi sẽ khá giàu :) Nếu nó không mở internet, bạn nên đặt thiết bị của bạn thông qua một VPN – Bartserk
Vì vậy, chỉ để được rõ ràng, bạn đang nói rằng nếu một thiết bị kết nối với trận đấu bằng cách sử dụng 3g didChangeState không bao giờ được gọi là? Bởi vì nó nên được gọi bất cứ khi nào một cầu thủ mới kết nối với trận đấu. Đó là nơi bạn nên kiểm tra số người chơi dự kiến cho 0. –