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);
}
這一切都有道理......但是當應用程序轉到後臺時,我不再需要與該應用程序進行通信。我需要與已打開的新應用程序進行通信,並將前一個應用程序發送到後臺。問題是,它啓動通信...並停止當前一個應用程序斷開連接...所以很短的時間有兩個應用程序連接。 Wierdness – Andy 2012-04-28 16:52:43
你是否檢查過你的服務器代碼,看看它是否意外斷開所有連接的客戶端的連接,當服務器應用程序(啓動你遇到問題的那個應用程序的那個應用程序)斷開連接? – 2012-04-29 12:58:23
我確定沒有任何會設置session.available = NO的呼叫。我也確定我沒有調用[session disconnectFromAllPeers]。我也確保我不會無意中初始化一個新的會話,但那也沒有發生。有一件事我認爲我需要仔細檢查,儘管......所有的會話委託方法都通過一個會話對象。我們用這個做什麼?這不是我們初始化開始會話的同一個對象嗎?我是否需要對通過會話對象傳遞的任何內容做任何事情? – Andy 2012-04-30 13:13:06