我是否需要以使用Peer Picker找到新的iPhone SDK 3.0中的對等體?iPhone SDK 3.0中的GameKit
我真的不想使用它,但我確實想使用點對點藍牙連接。有沒有示例代碼演示藍牙連接,而不使用Peer Picker? Apple提供的遊戲GKTank使用Peer Picker,所以我不能使用它。
我是否需要以使用Peer Picker找到新的iPhone SDK 3.0中的對等體?iPhone SDK 3.0中的GameKit
我真的不想使用它,但我確實想使用點對點藍牙連接。有沒有示例代碼演示藍牙連接,而不使用Peer Picker? Apple提供的遊戲GKTank使用Peer Picker,所以我不能使用它。
有兩種方法可以做到這一點。
第一種方式使用GameKit API。你開始有兩個獨立的類,一個實現GKSessionDelegate
協議,充當GameKit /藍牙「處理程序」,另一個作爲演示用戶界面(很可能是某種帶有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之間建立網絡,並且可以讓您定義關係是真正的對等還是主/從...
那麼,我正在設計一個移動ad-hoc藍牙網絡,我將使用數據挖掘技術進行分佈式計算任務。我不希望用戶(我)擔心選擇一個對等體進行連接。我計劃進行設置,以便所有iPod Touch都能掃描所有可用的iPhone/iPod Touch設備,然後將任務卸載到每個設備上。當談到對等體時,如果對等體已經在忙於執行任務,那麼它應該自動移動到下一個對等體。 – 2009-06-26 16:23:36
在這種情況下,建立客戶端以自動接受邀請,並將整個事情視爲主從關係。 每個人都必須運行該應用程序才能工作,藍牙或WiFi(儘管實際上您可能會將它基於Notificatons,儘管如果它尚未運行,則無法從通知中自動接受應用程序的啓動) 。 – 2009-06-26 19:34:53