GameKit в iPhone SDK 3.0
-
20-08-2019 - |
Вопрос
Я нуждаться использовать Выбор пиров найти аналогов в новом iPhone SDK 3.0?
На самом деле я не хочу его использовать, но я хочу использовать одноранговое соединение Bluetooth.Есть ли какой-нибудь пример кода, демонстрирующий соединение Bluetooth без использования Peer Picker?Игра ГКТанк который предоставляет Apple, использует Peer Picker, поэтому я не могу его использовать.
Решение
Есть два способа сделать это.
Первый способ использует 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, вероятно, немного проще, но если у вас уже есть код для Wi-Fi, его можно повторно использовать и для Bluetooth.
Другие советы
Почему вы не хотите его использовать?
Я не знаю, есть ли способ напрямую выполнить подключение по Bluetooth самостоятельно, и это представляет собой альтернативу поиску соединений другими способами.Он обеспечивает довольно удобную систему для настройки сети между несколькими iPod/Touch и позволяет вам определить, является ли связь действительно одноранговой или ведущей/подчиненной...