2013-02-12 5 views
0

나는 많은 iX (iPod, iPad, iPhone, ...) 장치간에 피어 투 피어 블루투스 연결을 구현하기 위해 GKSession, GKSessionDelegate을 사용하고 있습니다. 현재 사용 가능한/연결된 장치 목록을 범위에 표시하려면 을 표시하고 싶습니다.GKSession 블루투스 장치가 범위를 벗어날 때 결정

나는 현재이 작업을 수행

- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state

에 의존하고있다. 안타깝게도이 방법은 장치가 범위를 벗어날 때 안정적으로 호출되지 않는 것처럼 보입니다. 장치가 범위 내에 있는지를 판단하는 "더 나은"방법이 있습니까?

일부 코드 :

- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state { 

    NSString* connectionStateString= 
    (state==GKPeerStateAvailable)[email protected]"available": 
    (state==GKPeerStateUnavailable)[email protected]"unavailable": 
    (state==GKPeerStateConnected)[email protected]"connected": 
    (state==GKPeerStateDisconnected)[email protected]"disconnected":@"connecting"; 
    // Add the peer to the Dictionary 
    NSArray* details=[NSArray arrayWithObjects:[session displayNameForPeer:peerID],connectionStateString,nil]; 
    [connectionPeers setObject:details forKey:peerID]; 

    if (state == GKPeerStateAvailable) { 
     NSLog(@"Adding peerID:%@",peerID); 
     [session connectToPeer:peerID withTimeout:60];//'connect' to everything, so data can be sent 
    } 
    else if (state == GKPeerStateUnavailable || state==GKPeerStateDisconnected) { 
     [connectionPeers removeObjectForKey:peerID]; 
    } 
    [self listPlayers]; 
} 

답변

1

GKSession는 블루투스를 통해 Bonjour를 구축하고, 나는 당신의 문제가 피어 연결이 끊어 때 봉쥬르 서비스 광고를 무효화하지 않기 때문에 봉쥬르 서비스가 여전히 활성 표시되는지이라고 생각 네트워크에서. 제 생각에는 mDNS 레코드가 만료 될 때 (mDNS 캐시 타임 아웃이 발생할 때만) 또는 광고 피어가 수동으로 서비스를 무효로 할 때입니다.

GKSession이 광고를 통해 원하는 것을 쉽게 수행 할 것이라고 생각하지 않습니다. 그러나 연결된 피어는 블루투스 범위를 벗어나면 연결을 끊어야합니다.

+0

답장을 보내 주셔서 감사합니다. @ 마크. 필자는 정기적으로 모든 장치에 메시지를 보내고 응답을 수신하여이 문제를 해결했습니다. 응답을받지 못하면 '연결됨'목록에서 장치를 제거했습니다. 나는 안정적으로 '연결이 끊어진'상태 변화를 얻지 못했고, 이는 장치가 범위를 벗어난 곳, 즉 전체적인 문제임을 나타냅니다. 나는 여전히 나의 해결책이 꽤 끔찍하다고 생각하며, 더 좋은 방법이 있다고 희망한다. – iPadDeveloper2011

+1

GKSession over bluetooth는 끔찍합니다.) 앞으로 BTLE과 CoreBluetooth API를 살펴 보는 것이 좋습니다. –

+0

@Mark에 감사드립니다. 내 생각에 나 할것 같아. GKSession BT는 내가 원하는 것을하지 않았습니다 - 범위가 너무 좋았습니다! 나는 시선과 비슷한 것을 원했다. BTLE은 그게 좋을 것 같고 다른 장치 (예 : 안드로이드) 사이에서도 통신합니다. – iPadDeveloper2011