I am getting duplicate peername if I connect and disconnect bluetooth multiple time in my both ios device.
Is there any way to get single name for unique peer in gkpeerpickercontroller for bluetooth chat application.
Also attached the screenshot for it.

I am using below code to show 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;
}
}
You GKPeerPickerControllerDelegate method
Returns a new session every time. In your case its being called twice and hence two sessions are created. From the documentation:
So you can declare the session as a property and write a getter and just return the session property in the delegate which will avoid creation of multiple sessions
And change the delegate method to :
Make sure to nullify the session when you're done.