Есть два способа сделать это.
Первый способ использует GameKit API. Вы начинаете с наличия двух отдельных классов, один из которых реализует протокол GKSessionDelegate
и действует как «обработчик» GameKit / Bluetooth, а другой - как пользовательский интерфейс презентации (скорее всего, какой-то вид контроллера представления с табличным представлением). Чтобы подключить его, обработчик управляет уведомлениями GameKit и т. Д., А затем вызывает методы делегата в пользовательском интерфейсе для обновления представления таблицы при подключении / отключении однорангового узла и т. Д. Таким образом, когда устройства приходят и уходят, ваш список выбора следует обновить, чтобы показать, кто вокруг.
Ниже приведен код для начала работы:
- (BOOL) startPeer
{
BOOL result = NO;
if (!_session) {
_session = [[GKSession alloc] initWithSessionID:BLUETOOTHSESSION
displayName:nil
sessionMode:GKSessionModePeer];
_session.delegate = self;
[_session setDataReceiveHandler:self withContext:nil];
_session.available = YES;
result = YES;
}
return result;
}
- (void) stopPeer
{
// Set up the session for the next connection
//
[_session disconnectFromAllPeers];
_session.available = YES;
[self cleanupProgressWindow];
}
- (void) loadPeerList
{
self.peerList = [[NSMutableArray alloc] initWithArray:[_session peersWithConnectionState:GKPeerStateAvailable]];
}
- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state
{
BOOL peerChanged = NO;
switch(state) {
// When peer list changes, we adjust the available list
//
case GKPeerStateAvailable:
if (_peerList) {
[_peerList addObject:peerID];
peerChanged = YES;
}
break;
// When peer list changes, we adjust the available list
//
case GKPeerStateUnavailable:
if (_peerList) {
[_peerList removeObject:peerID];
peerChanged = YES;
}
break;
// Called when the peer has connected to us.
//
case GKPeerStateConnected:
// start reading and writing
break;
case GKPeerStateDisconnected:
{
if (_isWriter) {
_isConnected = NO;
_deviceToSend = nil;
[self cleanupProgressWindow];
} else {
// Other side dropped, clean up local data and reset for next connection
self.dataRead = nil;
}
}
break;
}
// Notify peer list delegate that the list has changed so they can update the UI
//
if (peerChanged)
CALLDELEGATE(_peerListDelegate, peerListChanged);
}
Второй способ сделать это - использовать стандартные механизмы выбора услуг Bonjour. GameKit реализован поверх Bonjour (но через Bluetooth вместо Wi-Fi), поэтому, когда обе стороны прошли через сетевую доступность друг с другом и соединились, они регистрируются в Bonjour и действуют как любая служба Bonjour. Путь GameKit, вероятно, немного проще, но если у вас уже есть код для WiFi, его можно использовать и для Bluetooth.