使用GameKit连接第三台设备 [英] Connect 3rd Device using GameKit

查看:150
本文介绍了使用GameKit连接第三台设备的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我现在正在基本级别上使用GameKit。我能够连接两个设备并在它们之间发送消息。

I am using GameKit on a basic level right now. I am able to connect two devices and send messages between them.

我有3台设备,我们称之为设备A,B和C.

I have 3 devices, we'll call them device A, B and C.

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

I am able to connect A to B, A to C, and B to C, as individual setups.

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

If I connect A to B, then attempt to connect B to C, Device C will show that Device B is available, but device B continues to spin and say "Looking for available iPod, iPhones..."

peerPickerController:sessionForConnectionType:,当我尝试将B连接到C时,我试图让设备B重用它正在使用的相同的 GKSession 在与A ...的连接中,因为如果我在设备B上创建一个新会话,它可以连接到设备C,但会断开与设备A的连接。

In peerPickerController:sessionForConnectionType: , when I am attempting to connect B to C, I am trying to have device B reuse its same GKSession that it is using in its connection to A... because if I create a new session on device B, it is able to connect to Device C but drops the connection to device 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;
    }


推荐答案

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

I ended up going with a Server / Client setup, which is easier to manage. This way, there is only one Server PeerID, as opposed to a Server PeerID for every connection. I wasn't able to find many good examples, so I've included the basic GameKit Server / Client code here.

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

这篇关于使用GameKit连接第三台设备的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆