2012-04-26 11 views
1

2つのアプリケーションの間にGKSessionがあります。 1つはサーバー、もう1つはクライアントです。サーバーは、クライアントアプリケーションにurlschemeコマンドで別のアプリケーションを起動させます。GKSession - アプリケーションの切り替えとセッションの維持

クライアントアプリケーションがシャットダウンすると、セッションが終了し、別のアプリケーションが開き、新しいセッションが開始されます。

実際に起こっていることは、私にとって謎のビットです。基本的に、新しいアプリが開き、サーバーとの通信が始まります。 GKPeerStateDisconnectedのケースは、接続されていた以前のアプリケーションでsession: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

それはすべて意味があります...しかし、アプリがバックグラウンドに行くとき、私はもう本当にそのものと通信する必要はありません。私は開いた新しいアプリと通信し、前のアプリをバックグラウンドに送りました。問題は、通信を開始することです...以前のアプリが切断されると停止します...そのため、短時間の間に2つのアプリが接続されています。 Wierdness – Andy

+0

サーバーコードをチェックして、電話機の「サーバー」アプリ(問題のあるアプリを起動するアプリ)が切断されたときに、誤って接続されているすべてのクライアントを切断していないかどうか確認しましたか? –

+0

私はsession.available = NOを設定するコールがないことを確認しました。私は[セッションdisconnectFromAllPeers]を呼んでいないことを確認しました。私は何とか新しいセッションを間違って初期化していないことを確認しましたが、それも起こっていませんでした。セッションのデリゲートメソッドはすべてセッションオブジェクトに渡します。私たちはこれで何をしますか?これはセッションを開始するために初期化されたオブジェクトと同じではありませんか?セッションオブジェクトで渡されたものを何か処理する必要がありますか? – Andy

関連する問題