2013-06-03 4 views
2

GKSession을 작동시키는 데 문제가 있습니다. 아래는 특정 버튼을 눌렀을 때 실행되는 코드입니다.iOS 6.1에서 GKSession (Bluetooth)을 올바르게 설정하는 방법

GKSession *session; 
if (connectButtonHasBeenPressed == false) { 
    NSLog(@"connectToBluetoothDevice has been called"); 
    connectButtonHasBeenPressed = true; 
    GKSession *session = [[GKSession alloc] initWithSessionID:@"Unicorn" displayName:nil sessionMode:GKSessionModePeer]; 
    [session setDataReceiveHandler:self withContext:nil]; 
    [session setDelegate:self]; 
    [session setAvailable:YES]; 
    NSLog(@"Session ID: %@", [session sessionID]); 
    NSLog(@"Currently Available Peers: %i", [[session peersWithConnectionState:GKPeerStateAvailable] count]); 
    if ([session isAvailable]) { 
     NSLog(@"The Session Is Available"); 
    } 
    [connectToDeviceButton setTitle:@"Searching..." forState:UIControlStateNormal]; 

} 
else { 
    NSLog(@"Currently Available Peers: %i", [[session peersWithConnectionState:GKPeerStateAvailable] count]); 
} 

버튼을 처음으로 누르면 모든 것이 정상적으로 작동하는 것 같습니다. 그 후에 버튼을 누를 때마다 "현재 사용 가능한 피어 : 0"이 인쇄됩니다. 두 장치가 서로 옆에 앉아 있어도 버튼을 눌렀을 때 둘 다 프로그램을 실행하지 않으면이 출력이 예상됩니다. 또한이 클래스에 구현 된 모든 GKSessionDelegate 메서드를 모두 콘솔에 메시지로 기록합니다. 그 방법들 중 어느 것도 실행되지 않습니다. 이 모든 것이 장치가 서로를 찾을 수 없다는 것을 나에게 알릴 것입니다.

그러나 GKSession을 사용하여 두 장치를 연결하는 샘플 프로그램 GKRocket을 실행했으며이 두 장치간에 잘 작동합니다. GKRocket의 코드를 프로그램 코드와 비교해 보았습니다. GKSession에 영향을 줄 수 있다고 생각되는 차이점을 발견하지 못했습니다.

제안 사항?

답변

2

두 개의 GKSession 인스턴스가있는 것 같습니다. 외부 하나는 if 문 내부에 있습니다.

즉, connectButtonHasBeenPressedfalse 인 경우 유지하는 GKSession의 자체 버전을 생성합니다. 그러나 true 인 경우 sessionnil과 같습니다.

또한 번들 ID를 사용하여 설정하면 세션 ID로 nil을 사용하는 것이 좋습니다. 이것은 개인적인 선호 일지 모르지만.

하면이 같은 것을 사용하여 시도해보십시오 GKSession이 항상하는 경우이어야한다 전무, 동일한 경우

if (session == nil) 
{ 
    NSLog(@"connectToBluetoothDevice has been called"); 
    session = [[GKSession alloc] initWithSessionID:nil displayName:nil sessionMode:GKSessionModePeer]; 
    [session setDataReceiveHandler:self withContext:nil]; 
    [session setDelegate:self]; 
    [session setAvailable:YES]; 

    NSLog(@"Session ID: %@", [session sessionID]); 
    if ([session isAvailable]) 
    { 
     NSLog(@"The Session Is Available"); 
    } 
    [connectToDeviceButton setTitle:@"Searching..." forState:UIControlStateNormal]; 

    connectButtonHasBeenPressed = true; 
} 

NSLog(@"Currently Available Peers: %i", [[session peersWithConnectionState:GKPeerStateAvailable] count]); 

당신은 정말 그냥 확인할 수 있습니다로 connectButtonHasBeenPressed 변수가 필요하지 않습니다이 연결되어 있지 않습니다. 세션이 끝나면 항상 모든 세션 작업을 취소하고 session = nil;을 설정해야합니다.

session 변수는 .h 파일에서 실제로 선언되어야 클래스 전체에서 사용할 수 있습니다. 따라서 GKSession *session;은 더 이상 필요하지 않습니다.

참고 :connectToBluetoothDevice has been called 로그의 메모입니다. 내 경험에 비추어 볼 때, GKSession은 사용할 수있는 것에 따라 WiFi 또는 Bluetooth를 사용할 것입니다. 당신이 3 개의 장치를 가질 수 있도록, 블루투스가 켜져 있고, WiFi가 켜져 있고, 마지막으로 둘 다 켜져 있고, 모두 연결되어 있고 서로 절대적으로 잘 이야기합니다.

희망이 도움이됩니다.

편집 : 불필요한 connectButtonHasBeenPressed 변수를 예제 코드에서 제거하고 자세한 설명을 추가했습니다.

+0

또한 iOS 5와 iOS 6의 기기간에 연결 문제가있을 수 있습니다. Apple 문제인 것으로 보이며 버그 수정이있는 것 같지 않습니다. – Baza207

+0

감사합니다. 나는 GKSession의 두 가지 경우를 보지 못했다. –