2011-03-31 64 views
0

我现在在基本级别上使用GameKit。我可以连接两个设备并在它们之间发送消息。使用GameKit连接第三个设备

我有3台设备,我们会打电话给他们装置A,B和C

我能A连接到B,A至C和B到C,作为单独的设置。

如果我将A连接到B,然后尝试将B连接到C,则设备C将显示设备B可用,但设备B继续旋转并说“寻找可用iPod,iPhone ...”

peerPickerController:sessionForConnectionType:中,当我试图将B连接到C时,我试图让设备B重复使用它在其连接中使用的相同GKSession ...因为如果我在设备B上创建新会话,能够连接到设备C,但下降到设备A.

这里的连接是sessionForConnectionType

-(GKSession*)peerPickerController:(GKPeerPickerController *)picker sessionForConnectionType:(GKPeerPickerConnectionType)type { 

    // session is a synthesized GKSession 
     if (session == nil) { 
      session = [[GKSession alloc] initWithSessionID:nil displayName:@"" sessionMode:GKSessionModePeer]; 
      session.delegate = self;   
     } 


     return session; 
    } 

回答

4

我结束了一个服务器/客户端设置,这是更容易管理。这样,只有一个服务器PeerID,而不是每个连接的服务器PeerID。我无法找到很多好的例子,所以我在这里包含了基本的GameKit服务器/客户端代码。

// if the device in an ipad, treat it as a host/server 
if ([[[UIDevice currentDevice] model] isEqualToString:@"iPad"]) { 
     isHost = YES; 
    } else { 
     isHost = NO; 
    } 

// monitor if this device is connected to another device 
    isConnected = NO; 
} 




#pragma mark GameKit Methods 

// Called when a change in the connection state is detected 
- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state { 

    NSLog(@"Session:Peer:%@ Did Change State", peerID); 
    Globals *globals = [Globals shareData]; 

    switch (state) { 
     case GKPeerStateConnected: 
      NSLog(@"GKPeerStateConnected"); 

      [globals.localSession setDataReceiveHandler:self withContext:nil]; 

// if this device is not the host and is not connected yet... 
      if (!isHost && !isConnected) { 

// update variables, save the Server PeerId and the local Session so we can use them later 
       isConnected = YES; 
       serverSession = peerID]; 
       localSession = session; 
      } 
      break; 

     case GKPeerStateDisconnected: 
      NSLog(@"GKPeerStateDisconnected"); 
      break; 

     case GKPeerStateAvailable: 
      NSLog(@"GKPeerStateAvailable"); 
      if (!isHost) { 
       NSLog(@"Attempting to Connect..."); 
// the server is available, try to connect to it 
       [session connectToPeer:peerID withTimeout:20]; 
      } 
      break; 

     case GKPeerStateConnecting: 
      NSLog(@"GKPeerStateConnecting"); 
      break; 

     case GKPeerStateUnavailable: 
      NSLog(@"GKPeerStateUnavailable"); 
      break; 
    } 

} 

// Called if this device receives a request for a connection 
// This should only happen on the Server device 
-(void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID { 
    NSLog(@"Received Connection Request From %@", peerID); 

// Accept the connection request from the peer 
    [session acceptConnectionFromPeer:peerID error:nil]; 
} 

- (void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession:(GKSession *)session context:(void *)context { 
    NSLog(@"Received Data"); 
} 

-(void)session:(GKSession *)session didFailWithError:(NSError *)error { 
    NSLog(@"Session Failed: %@", error); 
} 


// Connected to a UIButton 
-(IBAction)sendData { 
    NSLog(@"Sending Data ..."); 
} 

// Connected to a UIButton 
-(IBAction)beginConnection { 

    Globals *globals = [Globals shareData]; 

// Set this up as a server 
    if (isHost) { 
     GKSession *session = [[GKSession alloc] initWithSessionID:@"" displayName:@"Server" sessionMode:GKSessionModeServer]; 
     session.delegate = self; 
     session.available = YES;  
     NSLog(@"Setting Server Session Peer:%@", session.peerID); 
     globals.localSession = session; 
    } 

// or set it up as a client 
else { 
     GKSession *session = [[GKSession alloc] initWithSessionID:@"" displayName:nil sessionMode:GKSessionModeClient]; 
     session.delegate = self; 
     session.available = YES; 
     NSLog(@"Setting CLIENT Session Peer:%@", session.peerID); 
     globals.localSession = session; 
    } 

} 


... Dealloc, etc... 

@end 
+0

嘿克里斯,我期待实现iOS设备的客户端服务器模型。我没有找到很多关于这方面的信息,你能建议我使用一些指针或资源吗? – slonkar 2011-11-10 02:17:41

+0

@SumitLonkar这是我写的关于这个帖子的文章(http://stackoverflow.com/a/12738287/1079207) – 2012-10-14 00:40:06