【发布时间】:2010-11-06 04:05:12
【问题描述】:
我是否需要使用Peer Picker 在新的 iPhone SDK 3.0 中查找对等点?
我真的不想使用它,但我确实想使用点对点蓝牙连接。是否有任何示例代码可以在不使用 Peer Picker 的情况下演示蓝牙连接?苹果提供的游戏GKTank使用了Peer Picker,所以我不能用。
【问题讨论】:
标签: iphone bluetooth ipod-touch
我是否需要使用Peer Picker 在新的 iPhone SDK 3.0 中查找对等点?
我真的不想使用它,但我确实想使用点对点蓝牙连接。是否有任何示例代码可以在不使用 Peer Picker 的情况下演示蓝牙连接?苹果提供的游戏GKTank使用了Peer Picker,所以我不能用。
【问题讨论】:
标签: iphone bluetooth ipod-touch
有两种方法可以做到这一点。
第一种方式使用 GameKit API。您首先拥有两个独立的类,一个实现GKSessionDelegate 协议并充当GameKit/蓝牙“处理程序”,另一个充当演示UI(很可能是某种带有tableview 的viewcontroller)。您将其连接起来的方式是处理程序管理 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 之间建立网络,并让您定义关系是真正的对等还是主/从...
【讨论】: