1

我在两个应用程序之间有一个 GKSession。一个是服务器,另一个是客户端。服务器使客户端应用程序使用 urlscheme 命令启动另一个应用程序。

我希望发生的是,当客户端应用程序关闭时,会话结束,另一个应用程序打开,我们开始一个新的会话。

实际发生的事情对我来说有点神秘。基本上,新应用程序打开并开始与服务器通信。大量数据包在两者之间来回发送......但在短时间内(3-5 秒)后,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);
}
4

1 回答 1

0

这听起来像是对多任务处理的限制。Peer Picker 可能具有额外的系统级访问权限,允许您的后台应用程序继续与服务器通信。如果不使用该代码,您的后台应用程序将在传统的 3-5 秒内完成操作,然后进入后台状态,断开与服务器的连接。

于 2012-04-27T16:06:36.723 回答