Дублирующиеся имена пиров появятся в контроллере GKPeerPicker

Я получаю дублирующееся одноранговое имя, если я подключаюсь и отключаю Bluetooth несколько раз на моем устройстве ios.

Есть ли способ получить одно имя для уникального пира в gkpeerpickercontroller для приложения чата Bluetooth.

Также прикрепил скриншот для этого.Появляется несколько дублирующих пиров

Я использую код ниже, чтобы показать GKPeerPickerController.


-(IBAction)btnConnectClicked:(id)sender
 {
    [self openPeerPickerController];
 }

-(IBAction)btnDisconnectClicked:(id)sender
{
    [currentSession disconnectFromAllPeers];
}
-(void)openPeerPickerController
{
    if (!currentSession)
    {
        GKPeerPickerController *peerPicker2 = [[GKPeerPickerController alloc] init];
        peerPicker2.delegate = self;
        peerPicker2.connectionTypesMask = GKPeerPickerConnectionTypeNearby;
        [peerPicker2 show];
    }
}

-(void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *) session
{
    NSLog(@"Peer session connected");
    //set session delegate and dismiss the picker
    session.delegate = self;
    currentSession = session;
picker.delegate = nil;
    [picker dismiss];
}
- (GKSession *)peerPickerController:(GKPeerPickerController *)picker sessionForConnectionType:(GKPeerPickerConnectionType)type
{
    //create ID for session
    NSString *sessionIDString = @"MTBluetoothSessionID";
    //create GKSession object
    GKSession *session = [[GKSession alloc] initWithSessionID:sessionIDString displayName:nil sessionMode:GKSessionModePeer];
    return session;
}

-(void)peerPickerControllerDidCancel:(GKPeerPickerController *)picker
{
    NSLog(@"Peer cancelled");
    [currentSession disconnectFromAllPeers];
    currentSession=nil;
    picker.delegate = nil;
}
-(void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state
{
    switch (state)
    {
        case GKPeerStateAvailable:
        {
           // not connected to session, but available for connectToPeer:withTimeout:
        }
        break;

        case GKPeerStateUnavailable:
        {
            // no longer available
        }
            break;

        case GKPeerStateConnected:
        {
            // connected to the session
            [currentSession setDataReceiveHandler:self withContext:nil]; //set ViewController to receive data
        }
            break;

        case GKPeerStateDisconnected:
        {
            // disconnected from the session
            currentSession.delegate = nil;
            currentSession = nil; //allow session to reconnect if it gets disconnected
        }
            break;

        case GKPeerStateConnecting:
        {
            // waiting for accept, or deny response
        }
            break;

        default:
            break;
    }
}

1 ответ

Вы GKPeerPickerControllerDelegate метод

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

Возвращает новый сеанс каждый раз. В вашем случае он вызывается дважды и, следовательно, создаются две сессии. Из документации:

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

Таким образом, вы можете объявить сеанс как свойство, написать метод получения и просто вернуть свойство сеанса в делегате, что позволит избежать создания нескольких сеансов.

@property (nonatomic, string) GKSession *session;
#define sessionIDString @"MTBluetoothSessionID"

- (GKSession) session {
    if(!_session) {
        //create GKSession object
        _session = [[GKSession alloc] initWithSessionID:sessionIDString displayName:nil sessionMode:GKSessionModePeer];
    }
    return _session;
}

И измените метод делегата на:

- (GKSession *)peerPickerController:(GKPeerPickerController *)picker sessionForConnectionType:(GKPeerPickerConnectionType)type {
    return self.session;
}

Обязательно аннулируйте сессию, когда закончите.

Другие вопросы по тегам