2012-08-06 3 views
1

GKSession을 사용하여 2 대 이상의 휴대 전화간에 데이터를 전송하는 앱을 만들려고합니다.

첫째 : 다음 GKPeerPicker를 사용 그러나 여기 .. ​​내가 내 자신 WIFI interface .. 사과가 수행하는 방법에 대한 지시 사항 제공하지 않습니다 구현해야 할 시점에 박히 :GKPeerPicker를 사용하지 않고 GKSession을 통해 휴대 전화간에 데이터를 전송하는 방법

을 것이 두 가지 옵션이있다
- (void)peerPickerController:(GKPeerPickerController *)picker didSelectConnectionType: (GKPeerPickerConnectionType)type { 
    if (type == GKPeerPickerConnectionTypeOnline) { 
     picker.delegate = nil; 
     [picker dismiss]; 
     [picker autorelease]; 
     // Implement your own internet user interface here. 
    } 
} 

두 번째 : 예 : this 예와 같이 GKPeerPicker를 건너 뛰고 전체 작업을 수행합니다. 그러나 응용 프로그램 dev에 설명서를 보내거나 GKPeerPicker .. 사용하지 않고 데이터를 수신하는 방법에 대한 지침을 제공하지 않습니다 (도 그 웹상에서 그 모든 예제를 찾을 수 있습니다)

어떤 아이디어 여러분?

+0

게임을 위해 인터넷을 기반으로 서버를 사용하는 경우에 대해 당신이 당신의 자신의 무선 랜 인터페이스 회담을 구현의 측면에서 연결 문제 PeerPicker가 의도하는 P2P가 아닌 온라인 게임을 할 수 있습니다. 또한 자신의 인터페이스를 구현한다고하면 실제 Wi-Fi 인터페이스가 아니라 사용자 인터페이스를 의미하며 이는 귀하의 질문에 포함되어 있습니다. – Jasarien

+0

내 connectionTypesMask가 GKPeerPickerConnectionTypeNearby (예 : 블루투스) 인 경우 PeerPicker는 '가까운 ipads/iphone 등을 찾아서'라고 말하는 모달 팝업을 표시하고 기기를 찾아 페어링 할 때까지 peerPickerController를 트리거합니다. didConnectPeer : toSession : 콜백. 그러나 내 연결이 GKPeerPickerConnectionTypeOnline (예 : 온라인)이면 다음과 같이 다른 장치를 찾기 위해 * 검색 *을해야합니다. 연결을 완료해야합니다. 아무 것도 찾을 수 없습니다. 이 절차와 관련된 .. 그게 내가 진짜 묻는거야 – abbood

답변

4

난 그냥 peerpicker없이 장치를 연결하는 방법을 알아 냈어. 문서가 꽤 불투명하기 때문에 약간의 추측 게임이었습니다. 인터넷에 관한 정보를 너무 오랫동안 찾았습니다. 나는 미래의 모든 사람들이 가질 수있는 질문을 정리하기 위해 모든 것을 여기서 설명하려고 노력할 것입니다. 문서에서

:

GKSession 개체를 발견하고 블루투스 또는 Wi-Fi를 사용하여 근처의 iOS 장치에 연결할 수있는 기능을 제공합니다.

이것은 나를 이해하는 첫 번째 단계입니다. 나는 GKPeerPickerController가 광고와 연결에 책임이 있다고 생각했지만 GKSession은 실제로 그렇게했다.

두 번째로 이해해야 할 것은 피어이 반드시 연결되어 있지 않아야한다는 것입니다. 그들은 발견되고 연결되기를 기다리는 바로 근처에있을 수 있습니다. 모든 동료가 상태를

  • GKPeerStateAvailable가 (이 유용 것입니다!)
  • GKPeerStateUnavailable는

가 어떻게 우리가 실제로 연결합니까 GKPeerStateConnecting

  • 을 GKPeerStateDisconnected GKPeerStateConnected? 가 제공 될 때 그럼 먼저 우리는 우리 주변의 동료를 찾아 볼 수하는 GKSession 개체를 만들 수 있습니다

    // nil will become the device name 
    GKSession *gkSession = [[GKSession alloc] initWithSessionID:@"something.unique.i.use.my.bundle.name" displayName:nil sessionMode:GKSessionModePeer]; 
    [gkSession setDataReceiveHandler:self withContext:nil]; 
    gkSession.delegate = self; 
    gkSession.available = YES; // I'm not sure this if this is the default value, this might not be needed 
    

    이제 우리는 약간의 대리인에 응답 호출해야합니다.session:didReceiveConnectionRequestFromPeer:session:peer:didChangeState는 (당신은 또한 분리하고 적절하게 실패 GKSessionDelegate의 통화를 처리한다)

    -(void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state 
    { 
        if(state == GKPeerStateDisconnected) 
        { 
         // A peer disconnected 
        } 
        else if(state == GKPeerStateConnected) 
        { 
         // You can now send messages to the connected peer(s) 
         int number = 1337; 
         [session sendDataToAllPeers:[NSData dataWithBytes:&number length:4] withDataMode:GKSendDataReliable error:nil]; 
        } 
        else if (state == GKPeerStateAvailable) 
        { 
         // A device became available, meaning we can connect to it. Lets do it! (or at least try and make a request) 
         /* 
         Notice: This will connect to every iphone that's nearby you directly. 
         You would maybe want to make an interface similar to peerpicker instead 
         In that case, you should just save this peer in a availablePeers array and 
         call this method later on. For your UI, the name of the peer can be 
         retrived with [session displayNameForPeer:peerId] 
         */ 
         [session connectToPeer:peerID withTimeout:10]; 
        } 
    

    은}

    다른 동료는 지금은에 응답해야 요청을 받았습니다.

    -(void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID 
    { 
        // We can now decide to deny or accept 
        bool shouldAccept = YES; 
        if(shouldAccept) 
        { 
         [session acceptConnectionFromPeer:peerID error:nil]; 
        } 
        else 
        { 
         [session denyConnectionFromPeer:peerID]; 
        } 
    } 
    

    마지막으로 우리의 작은 1,337 메시지를받을

    -(void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession:(GKSession*)session context:(void *)context 
    { 
        int number = 1337; 
        if([data isEqualToData:[NSData dataWithBytes:&number length:4]]) 
        { 
         NSLog(@"Yey!"); 
        } 
    }