2015-04-08 23 views
35

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?

+1

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

+0

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. –

Trả lời

2

Hgeg,

Không có gì sai với mã của bạn. Bạn phải cho phép sử dụng dữ liệu di động vào ứng dụng của mình cần sự cho phép của người dùng.

Đoạn sau đây được lựa chọn từ Apple's support website:

At the Foundation layer, you can use the setAllowsCellularAccess: method on NSMutableURLRequest to specify whether a request can be sent over a cellular connection. You can also use the allowsCellularAccess to check the current value.

At the Core Foundation layer, you can achieve the same thing by setting the kCFStreamPropertyNoCellular property before opening a stream obtained from the CFSocketStream or CFHTTPStream APIs.

In older versions of iOS, you can continue to use the kSCNetworkReachabilityFlagsIsWWAN as a best-effort way of determining whether traffic will be sent over a cellular connection, but you should be aware of its limitations.

Chúc may mắn

Iman

0

Dựa trên mã mà bạn đã hiển thị cho chúng tôi, không nên có bất kỳ vấn đề nào bất kể loại kết nối, 3G hoặc cách khác; tuy nhiên, nếu trước đây bạn đã xen kẽ mã để xử lý ngoại lệ được gắn lại trạng thái kết nối hoặc đồ họa đại diện cho trạng thái tải, có thể có thứ gì đó được gắn ở nơi khác một cách hợp lý và tạo lỗi này vào thời điểm này trong logic trò chơi. Ngay cả một đồ họa spinner tham nhũng có thể trở thành một vấn đề.

Bạn có bất kỳ xử lý ngoại lệ khác trong đoạn code đó được gọi như sau:

request.playersToInvite 

hoặc

request.playerGroup 

hoặc

làm thay đổi một lớp đặc loader?

+0

Cũng sẽ quan tâm đến bất kỳ mã nào khác mà bạn quan tâm trong khi bạn có tiền thưởng mở. – miniscule

+0

Vui lòng cho chúng tôi thấy bất kỳ mã nào trực tiếp điều chỉnh tùy chọn trung tâm trò chơi, trả về hàng đợi chính mà không cần xác minh trạng thái hoặc có liên quan đến autorelease (luôn luôn có vẻ nhạy cảm). Bạn có nhận thấy bất kỳ sự khác biệt nào giữa các phiên bản iOS một cách tình cờ không? Ngoài ra, tôi khuyên bạn nên viết một trình xử lý lời mời và giới thiệu việc ghi nhật ký để bạn làm nhiều hơn các thông báo trong các thường trình. Tôi biết nó có thể tẻ nhạt, nhưng tôi chắc chắn đồng ý với tuyên bố của bạn về nguy cơ phát hành. – miniscule

+0

Trước bất cứ điều gì khác, hãy đặt NSLog (@ "L ERI: Lỗi makeMatch:% @", [mô tả lỗi]); nơi mà lỗi của bạn bắt được và cho chúng tôi biết kết quả. Bạn có thể muốn xem xét việc thay đổi thành mô hình mời tham gia nhiều hơn để bạn có thể linh hoạt hơn. Có, bạn sẽ thêm tính phức tạp, nhưng bạn càng dành nhiều thời gian cho việc kết nối máy nghe nhạc của bạn (và thông điệp trạng thái) vững chắc, sự hỗ trợ lâu dài của bạn càng tốt. – miniscule

1

Theo những tin tức mới nhất của Apple, từ iOS 9, chế độ hộp cát sẽ không còn tồn tại, thay vì sandbox, bạn sẽ có một môi trường hợp nhất. Unified envoiroment

Vì vậy, bạn sẽ chỉ có một môi trường hợp nhất nơi bạn có thể chia sẻ cùng một tài khoản, điều này sẽ giải quyết tất cả các sự cố thường gặp từ chế độ Hộp cát.

Hệ thống thống nhất mới cũng tương thích với TestFlight để bạn có thể kiểm tra mã trên nhiều thiết bị và tài khoản.

Tất cả những thay đổi này sẽ được thực hiện trực tiếp bởi quả táo, vì vậy chỉ nghĩ rằng bạn có thể thực hiện để chờ cho đến khi cập nhật lên hệ thống mới, cho đến nay, đó là cách duy nhất để đảm bảo rằng đó không phải là vấn đề về Hộp cát . Để biết thêm thông tin, vui lòng liên hệ với WWDC video

Các vấn đề liên quan