我需要在新的iPhone SDK 3.0中使用Peer Picker来查找同行吗?
我不想使用它,但我确实想使用点对点蓝牙连接。有没有演示蓝牙连接而不使用Peer Picker的示例代码?苹果提供的游戏GKTank使用Peer Picker,所以我不能使用那个。
我需要在新的iPhone SDK 3.0中使用Peer Picker来查找同行吗?
我不想使用它,但我确实想使用点对点蓝牙连接。有没有演示蓝牙连接而不使用Peer Picker的示例代码?苹果提供的游戏GKTank使用Peer Picker,所以我不能使用那个。
GKSessionDelegate
协议并充当GameKit / Bluetooth“处理程序”,另一个作为演示UI(最有可能是带有tableview的视图控制器)。您会以方式连接它:处理程序管理GameKit通知等,然后在设备连接/掉落时调用UI上的委托方法来更新表格视图。这样,随着设备的出现和消失,您的选择器列表应更新以显示谁在附近。- (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实现的(但是通过蓝牙而不是WiFi),因此一旦两个端点彼此进行了网络可达性检查并连接成功,它们将在Bonjour下注册并像任何Bonjour服务一样运作。使用GameKit的方式可能会更容易一些,但如果您已经有了适用于WiFi的代码,也可以将其重用于蓝牙上。
为什么你不想使用它?
我不知道是否有一种直接自己进行蓝牙连接的方法,它提供了通过其他方式查找连接的替代方案。它提供了一个非常好的系统来建立一组iPod/Touches之间的网络,并允许您定义关系是真正的对等还是主/从...