2013-01-13 64 views
1

我使用GameCenter和實時服務器 - 客戶端網絡策略創建了一款紙牌遊戲。在沙箱中測試時,遊戲完美無瑕(使連接,選擇最佳主機,發送/接收數據),有時遊戲甚至可以完成而沒有問題。然而,大部分時間,在兩臺設備上我都會收到一個匹配:player:didChangeState:回叫,通知我反對用戶已斷開連接。它經常發生令人沮喪的事情,似乎沒有任何與閒置或超時有關的事情。我的想法是我可能會在GameCenter服務器上處理正常的網絡延遲,因爲在極少數情況下玩家似乎重新連接並再次發送數據。其他人使用GKMatch和Real Time GameCenter處理這些問題嗎?我正在測試運行iOS 6.1並連接到同一個WiFi網絡的iPhone 5和iPhone 4上的應用程序。實時GKMatch斷開連接問題

回答

0

儘管我沒有找到確切的解決方案,但我用以下方法修補了我的問題。此外,爲了防止在斷開連接期間丟失發送的消息:我實現了一個「響應」處理程序,該處理程序檢測消息是否實際上被對手接收(因爲當消息未被對手接收時,可靠數據發送模式不會出錯由於連接問題)。

當遊戲開始時,我確定用戶是主機(chooseBestHostPlayerWithCompletionHandler:^),當我檢測到斷開時,主玩家重新邀請非服務器玩家重新回到遊戲中。無論遊戲是通過邀請還是「立即遊戲」開始,這都是有效的。它解決了我的問題,「ShouldReconnect」只適用於1v1和邀請賽。當非主人玩家接受邀請時,我以編程方式完成比賽,以防止MatchMakerViewController不得不出現在屏幕上。一旦重新連接,比賽恢復沒有問題。

- (void)reinvitePlayer { 
    GKMatchRequest *request = [[GKMatchRequest alloc] init]; 
    request.minPlayers = 2; 
    request.maxPlayers = 2; 
    request.playersToInvite = @[_opponent.playerID]; 
    request.inviteMessage = @"Reconnect?"; 
    request.inviteeResponseHandler = ^(NSString *playerID, GKInviteeResponse response) 
    { 
     DLog(@"Player response = %i.",response); 
     // [self updateUIForPlayer: playerID accepted: (response == GKInviteeResponseAccepted)]; 
    }; 
    [[GKMatchmaker sharedMatchmaker] addPlayersToMatch:_match matchRequest:request completionHandler:^(NSError *error) { 
     if (error != nil) { 
      DLog(@"Unable to add player to match."); 
     } else { 
      DLog(@"Successfully reconnected"); 
      [[GKMatchmaker sharedMatchmaker] finishMatchmakingForMatch:_match]; 
     } 
    }]; 
} 
1

我對MAX player = 2有同樣的問題。 對我來說GKMatch的委託

- (void)match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state; 

收益「狀態」爲「GKPlayerStateDisconnected」甚至用戶在遊戲中活躍。 解決方案對我來說如下: 在我的NetworkManager類中,我已經將當前匹配引用爲gkMatch。因此,無論何時我再次將'狀態'設置爲'GKPlayerStateDisconnected',我都會檢查是否真的與遠程播放器斷開連接。爲此,我使用'gkMatch'數據如下: ps:如果會話實際上沒有斷開連接,則它包含字符串'連接'。

NSString *gkMatchString = [NSString stringWithFormat:@"%@",[NetworkManager sharedManager].gkMatch]; 

     if ([gkMatchString rangeOfString:@"connected"].location == NSNotFound) 
      { 
      NSLog(@"Session is actually closed."); 
      }else{ 
      NSLog(@"Session is NOT yet closed."); 
      } 

它適用於我,所以讓我知道它是否有助於任何人。

+0

它有幫助。我認爲這是最好的,但當你做交換機(會話)使'case:GKPlayerStateDisconnected'最後一個 – kezi

相關問題