2012-04-26 3 views
1

두 앱 사이에 GKSession이 있습니다. 하나는 서버이고 다른 하나는 클라이언트입니다. 서버는 클라이언트 응용 프로그램이 urlscheme 명령으로 다른 응용 프로그램을 시작하도록합니다.GKSession - 앱 간 전환 및 세션 유지

내가 원하는 것은 클라이언트 응용 프로그램이 종료되면 세션이 종료되고 다른 응용 프로그램이 열리고 새로운 세션이 시작된다는 것입니다.

실제로 일어나는 일은 나에게 약간의 수수께끼입니다. 기본적으로 새 앱이 열리 며 서버와의 통신이 시작됩니다. 좋은 양의 패킷이 두 패킷 사이에서 앞뒤로 보내지 만 짧은 시간 (3-5 초) 후에 GKPeerStateDisconnected 케이스는 세션에서 발생합니다 : peer : didChangeState : 이전에 연결된 응용 프로그램과 함께. 이렇게하면 응용 프로그램 간의 모든 통신이 중지됩니다.

원래이 피어 선택기를 사용하고 있었고 (수동 단추가 많이 필요하다는 것을 제외하면) 괜찮 았습니다. 이제 피어 (peer) 선택 도구를 제거하고이 과정을 자동으로 수행해야합니다.

-(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

+0

전화에서 "서버"앱 (문제가있는 앱을 실행하는 앱)이 끊어지면 실수로 연결된 모든 클라이언트의 연결을 끊는 지 확인하기 위해 서버 코드를 확인 했습니까? –

+0

session.available = NO로 설정할 호출이 없는지 확인했습니다. 또한 [session disconnectFromAllPeers]를 호출하지 않았 음을 확인했습니다. 어떻게 든 새로운 세션을 실수로 초기화하지는 않았 음을 확신 할 수 있었지만 그럴 수도 없었습니다. 한 가지 생각을 다시 할 필요가 있다고 생각합니다 ... 모든 세션 대리자 메서드는 세션 개체에서 전달됩니다. 우리는 이것을 어떻게합니까? 이것은 세션을 시작하기 위해 초기화 된 것과 동일한 객체가 아닙니까? 이 세션 객체에 전달 된 내용으로 무엇인가해야합니까? – Andy