我是否需要使用Peer Picker在新的 iPhone SDK 3.0 中查找对等点?
我真的不想使用它,但我确实想使用点对点蓝牙连接。是否有任何示例代码可以在不使用 Peer Picker 的情况下演示蓝牙连接?Apple 提供的游戏GKTank使用 Peer Picker,所以我不能使用它。
我是否需要使用Peer Picker在新的 iPhone SDK 3.0 中查找对等点?
我真的不想使用它,但我确实想使用点对点蓝牙连接。是否有任何示例代码可以在不使用 Peer Picker 的情况下演示蓝牙连接?Apple 提供的游戏GKTank使用 Peer Picker,所以我不能使用它。
有两种方法可以做到这一点。
第一种方式使用 GameKit API。您首先拥有两个独立的类,一个实现GKSessionDelegate
协议并充当 GameKit/蓝牙“处理程序”,另一个充当演示 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/Touch 之间建立网络,并让您定义关系是真正的对等还是主/从...