需要 使用 对等选择器 找到同伴,在新的iPhone SDK3.0?

我真的不想使用它,但我想使用的peer-to-peer蓝牙连接。是否有任何样本代码表明了蓝牙连接,而无需使用对等选择器?游戏 GKTank 苹果公司提供了采用对等选择器,因此我不能使用。

有帮助吗?

解决方案

有两种方法可以做到这一点。

第一种方法采用的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下注册,并像对待任何Bonjour服务。该方法的GameKit可能是更容易一些,但如果你已经有代码的WiFi可以重复使用蓝牙以及。

其他提示

你为什么要使用它?

我不知道有一种方法可以直接自己做一个蓝牙连接,以及它为寻求通过其他方式连接的替代品。它提供了一个相当不错的系统设置若干的iPod /触摸之间的网络,并允许您定义,如果关系是真正的对等或主/从...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top