1

2 つのアプリ間に GKSession があります。1 つはサーバーで、もう 1 つはクライアントです。サーバーは、urlscheme コマンドを使用して、クライアント アプリに別のアプリを起動させます。

私が望むのは、クライアント アプリがシャットダウンしたときにセッションが終了し、他のアプリが開き、新しいセッションを開始することです。

実際に何が起こっているのかは、私には少し謎です。基本的に、新しいアプリが開き、サーバーとの通信を開始します。かなりの数のパケットが 2 つの間で送受信されます... しかし、短い時間 (3 ~ 5 秒) の後、セッションで GKPeerStateDisconnected ケースが発生します。これにより、アプリケーション間のすべての通信が停止します。

私はもともとこれにピアピッカーを使用していましたが、うまく機能しました(手動でボタンを押す必要がたくさんあったことを除いて). 次に、ピア ピッカーを削除して、このプロセスを自動的に実行する必要があります。

-(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);
}
4

1 に答える 1

0

マルチタスクの制限のように聞こえます。ピア ピッカーには、バックグラウンド アプリがサーバーとの通信を継続できるようにする追加のシステム レベルのアクセス権がある場合があります。そのコードを使用しないと、バックグラウンド化されたアプリは、操作を完了するまで従来の 3 ~ 5 秒が与えられ、その後バックグラウンド状態になり、サーバーから切断されます。

于 2012-04-27T16:06:36.723 に答える