GameKit Сервер / Клиент - PullRequest
       8

GameKit Сервер / Клиент

2 голосов
/ 07 сентября 2010

Я пытался реализовать GameKit Framework для соединения Bluetooth и хочу использовать отношения сервер / клиент для уменьшения задержки и возможности различать подключенные устройства. Я нашел эту ветку , и это похоже на то, что я пытаюсь сделать, но код не работает для меня. Вот что у меня есть:

Способ подключения:

-(IBAction) btnConnect:(id) sender {
if(sender == server){
    [self.currentSession initWithSessionID:@"BT" displayName:nil sessionMode:GKSessionModeServer];
    currentSession.available == YES;
    NSLog(@"Setup Server");
}else{
    [self.currentSession initWithSessionID:@"BT" displayName:nil sessionMode:GKSessionModeClient];
    currentSession.available == YES;
    NSLog(@"Setup Client");
}
currentSession.delegate = self;
currentSession.disconnectTimeout = 0;
[currentSession setDataReceiveHandler:self withContext:nil];
[client setHidden:YES];
[server setHidden:YES];
[disconnect setHidden:NO];       
}

didChangeState:

- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state {
NSLog(@"didChangeState was called with status: %@.", state);
switch (state)
{
    case GKPeerStateConnected:
        NSLog(@"connected");
        break;
    case GKPeerStateDisconnected:
        NSLog(@"disconnected");
        [self.currentSession release];
        currentSession = nil;
        [connect setHidden:NO];
        [disconnect setHidden:YES];
        break;
    case GKPeerStateAvailable:
    NSLog(@"Server is Available, Presenting UIALert...");
    NSLog(@"%@", peerID);
    peerName = [session displayNameForPeer:peerID];
    NSLog(@"%@", peerName);
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Server Available!" message:[NSString stringWithFormat:@"The Server %@ is Available, Would you like to Connect?", peerName] delegate:self cancelButtonTitle:@"Decline" otherButtonTitles:@"Accept", nil];
    [alert show];
    [alert release];
    if(selection == @"accept"){
        [session connectToPeer:peerID withTimeout:15];
        session.available = NO;
    }else{
    }
            break;
      }
 }

didReceiveConnectionRequest:

- (void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID{
NSLog(@"Recieved Connection Request");
NSLog(@"%@", peerID);
peerName = [session displayNameForPeer:peerID];
NSLog(@"%@", peerName);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Connection Request" message:[NSString stringWithFormat:@"The Client %@ is trying to connect.", peerName] delegate:self cancelButtonTitle:@"Decline" otherButtonTitles:@"Accept", nil];
[alert show];
[alert release];
if(selection == @"accept"){
    [session acceptConnectionFromPeer:peerID error:nil];
}else{
    [session denyConnectionFromPeer:peerID];
}
}

Я думаю, что у меня все настроено правильно, но didChangeState не вызывается, чтобы сообщить пользователю, что доступно другое устройство. Я что-то упустил или я должен попытаться использовать другой метод. Спасибо за любую помощь

1 Ответ

1 голос
/ 07 сентября 2010
currentSession.disconnectTimeout = 0;

Тайм-аут отключения - это время в секундах, в течение которого одноранговые узлы должны ждать, прежде чем отключать не отвечающие одноранговые узлы. Вы не хотите, чтобы это было 0. По умолчанию это 20 секунд, вы должны оставить его там или сказать, как 10 секунд. На самом деле я не установил это в своем коде GameKit, и он хорошо работает.

Кроме того, это может помочь опубликовать весь ваш класс реализации где-нибудь. Нам нужно убедиться, что вы реализуете GKSessionDelegate, например ::100100

@interface SomeObject : NSObject <GKSessionDelegate>

Кроме того, вы настраиваете Peer-2-Peer выше. Вы сказали, что пытаетесь сделать клиент / сервер. Если это так, вы должны начать сеанс клиента с режимом GKSessionModeClient и сервером как GKSessionModePeer.

Наконец ... вы тестируете это на реальных устройствах или с устройством и симулятором? Не забывайте, что симулятор и iPhone первого поколения и штрихи не поддерживают Bluetooth. Таким образом, вам придется подключить всех участников к одной беспроводной сети, чтобы что-то произошло.

Что вы видите в консоли при запуске сеанса отладки?

...