Дублирующиеся имена пиров появятся в контроллере 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;
}
Обязательно аннулируйте сессию, когда закончите.