2012-04-26 60 views
1

我在兩個應用程序之間有一個GKSession。一個是服務器,另一個是客戶端。服務器使客戶端應用程序使用urlscheme命令啓動另一個應用程序。GKSession - 切換應用程序和維護會話

我想發生的事情是,當客戶端應用程序關閉時,會話結束,另一個應用程序打開,我們開始新的會話。

實際發生的事情對我來說有點神祕。基本上,新的應用程序打開並開始與服務器進行通信。許多數據包在兩者之間來回發送......但在短時間(3-5秒)之後,GKPeerStateDisconnected案例在會話中發生:peer:didChangeState:使用與之前連接的應用程序。這會停止應用程序之間的所有通信。

我最初使用的同行選擇器,它工作得很好(除了有大量的手動按鈕按你需要做)。現在我需要刪除對等選擇器並讓這個過程自動發生。

-(void)session:(GKSession *)session 
      peer:(NSString *)peerID 
didChangeState:(GKPeerConnectionState)state 
{ 
    BOOL peerChanged = NO; 
    NSLog(@"peer:%@ didChangeState: %d", peerID, state); 

switch(state) { 
    case GKPeerStateAvailable: 
      [session connectToPeer:peerID withTimeout:1000]; 
      peerChanged = YES; 
     break; 

    case GKPeerStateUnavailable: 
      peerChanged = YES; 
     break; 

    case GKPeerStateConnected: 
     [self.peerList addObject:peerID]; 
     [self setupConnectionWithPeer:peerID toSession:session]; 
     break; 

    case GKPeerStateDisconnected:   
     [self.peerList removeObject:peerID]; 
     if(self.peerList.count == 0) self.isConnected = NO; 
     break; 

    } 
    NSLog(@"Number of peers: %d", self.peerList.count); 
} 

回答

0

這聽起來像是對多任務的限制。 Peer Picker可能具有額外的系統級訪問權限,允許您的後臺應用繼續與服務器進行通信。如果沒有使用這些代碼,你的後臺應用程序會在傳統的3-5秒內完成操作,然後進入後臺狀態,從服務器上斷開連接。

+0

這一切都有道理......但是當應用程序轉到後臺時,我不再需要與該應用程序進行通信。我需要與已打開的新應用程序進行通信,並將前一個應用程序發送到後臺。問題是,它啓動通信...並停止當前一個應用程序斷開連接...所以很短的時間有兩個應用程序連接。 Wierdness – Andy 2012-04-28 16:52:43

+0

你是否檢查過你的服務器代碼,看看它是否意外斷開所有連接的客戶端的連接,當服務器應用程序(啓動你遇到問題的那個應用程序的那個應用程序)斷開連接? – 2012-04-29 12:58:23

+0

我確定沒有任何會設置session.available = NO的呼叫。我也確定我沒有調用[session disconnectFromAllPeers]。我也確保我不會無意中初始化一個新的會話,但那也沒有發生。有一件事我認爲我需要仔細檢查,儘管......所有的會話委託方法都通過一個會話對象。我們用這個做什麼?這不是我們初始化開始會話的同一個對象嗎?我是否需要對通過會話對象傳遞的任何內容做任何事情? – Andy 2012-04-30 13:13:06