Почему мои устройства не могут найти друг друга, используя этот код подключения Game Kit? - PullRequest
0 голосов
/ 20 апреля 2011

Я пытаюсь подключить два устройства через Bluetooth с помощью Game Kit. На первом устройстве запущено приложение со следующим кодом:

-(void)connect
{
    GKPeerPickerController*     picker;

    picker = [[GKPeerPickerController alloc] init];
    picker.delegate = self;
    //picker.connectionTypesMask = GKPeerPickerConnectionTypeNearby;
    picker.connectionTypesMask = GKPeerPickerConnectionTypeNearby;
    [picker show];

}
- (void)viewDidLoad {
    [super viewDidLoad];
    peerStatus = kServer;
    gamePacketNumber = 0;
    currentSession = nil;
    gamePeerId = nil;


    NSString *uid = [[UIDevice currentDevice] uniqueIdentifier];

    gameUniqueID = [uid hash];
    [self connect]; 

}

- (void)peerPickerController:(GKPeerPickerController *)picker didSelectConnectionType:(GKPeerPickerConnectionType)type {
    // GKSessionModeClient
   // GKSessionModeServer
    [self.currentSession initWithSessionID:kTankSessionID displayName:nil sessionMode:GKSessionModeClient];
    currentSession.available = YES;
    currentSession.delegate = self;

}

- (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session
{
     self.gamePeerId= peerID;
    //self.currentSession = session;

    self.currentSession.delegate = self;
    [self.currentSession setDataReceiveHandler: self withContext:nil];

    // Remove the picker.
    picker.delegate = nil;
    [picker dismiss];
    [picker autorelease];
    // Start your game
}

- (void)peerPickerControllerDidCancel: (GKPeerPickerController *)picker
{
      NSLog(@"peerPickerControllerDidCancel");
    picker.delegate = nil;
    [picker autorelease];

}


- (void)session: (GKSession*)session peer:(NSString*)peerID didChangeState:(GKPeerConnectionState)state
{
     NSLog(@"finding and connecting to others sessions");
    if(state    == GKPeerStateAvailable){
        NSLog(@"aviable and ready to conect");
        [session connectToPeer:peerID withTimeout:60];
        session.available =NO; //put YES si volem multiconexions sino es tancarà la sesio en conectarse 2
    }
}

- (void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID{
     NSLog(@"lisetn for others sessions");
    NSError *error=nil;
    if(amAcceptingConnetions){
        if(![session acceptConnectionFromPeer:peerID error:&error]){
            //Handler error
        }
    }else{
        [session denyConnectionFromPeer:peerID];
    }

}

На втором устройстве запущено другое приложение, использующее тот же код, что и выше, только с измененным следующим фрагментом:

[self.currentSession initWithSessionID:kTankSessionID displayName:nil sessionMode:GKSessionModeServer];

Нормальное окно появляется на обоих, чтобы указать, что они ищут другие устройства, но эти два устройства не распознают друг друга. Что здесь может быть не так?

Ответы [ 2 ]

0 голосов
/ 03 апреля 2012

Вы также должны импортировать PeerPickerController вместе с GameKit / Gamekit.h.Если вы хотите узнать больше, пожалуйста, обратитесь по этой ссылке .

или

http://www.devx.com/wireless/Article/43502/0/page/1

0 голосов
/ 02 декабря 2011

Вам необходимо выделить currentSession, если он еще не распределен. Возможно, попробуйте изменить:

[self.currentSession initWithSessionID:kTankSessionID displayName:nil sessionMode:GKSessionModeClient];

К этому:

self.currentSession = [[GKSession alloc] initWithSessionID:kTankSessionID displayName:nil sesssionMode:GKSessionModeClient];

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

...