iPhone SDK 3.0中的GameKit

Jos*_*ley 7 iphone bluetooth ipod-touch

是否需要使用Peer Picker在新的iPhone SDK 3.0中找到同伴?

我真的不想使用它,但我确实想使用点对点蓝牙连接.是否有任何示例代码在不使用Peer Picker的情况下演示蓝牙连接?Apple提供的游戏GKTank使用了Peer Picker,所以我无法使用它.

Ram*_*min 12

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

第一种方式使用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);           
}
Run Code Online (Sandbox Code Playgroud)

第二种方法是使用标准的Bonjour服务选择机制.GameKit是在Bonjour之上实现的(但是通过蓝牙而不是WiFi),所以一旦双方通过网络可达性相互连接并连接,它们就会在Bonjour下注册并像任何Bonjour服务那样行事.GameKit方式可能更容易一些,但如果您已经拥有WiFi代码,它也可以重复用于蓝牙.