iPhone SDK 3.0中的GameKit

7

我需要在新的iPhone SDK 3.0中使用Peer Picker来查找同行吗?

我不想使用它,但我确实想使用点对点蓝牙连接。有没有演示蓝牙连接而不使用Peer Picker的示例代码?苹果提供的游戏GKTank使用Peer Picker,所以我不能使用那个。

2个回答

12
有两种方法可以做到这一点。
第一种方法使用GameKit API。您需要两个单独的类,一个实现GKSessionDelegate协议并充当GameKit / Bluetooth“处理程序”,另一个作为演示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的代码,也可以将其重用于蓝牙上。


嗨,非常感谢提供这个模板来构建。还有一个问题,我可以看到session:peer:didChangeState方法该放在delegate.h/.m文件中,但其他方法呢?startPeer和stopPeer会放在我的viewcontroller.h/.m文件中吗?或者整个模板都会放在delegate文件中? - Josh Bradley
在这种情况下,假定所有这些都在委托处理程序中,因为它们涉及底层的GameKit管道。你完全可以把它们都放在视图控制器里面,但是最好将UI代码与网络代码解耦。更新对等体数组后,“handler”对象调用自己的自定义委托方法“peerListChanged”,通知视图控制器列表已更改,以便它可以调用表格重新加载并向用户显示新列表。 - Ramin
这只能在Wifi上工作还是也可以通过蓝牙找到对等设备?使用蓝牙必须使用对等选择器吗? - typeoneerror

-2

为什么你不想使用它?

我不知道是否有一种直接自己进行蓝牙连接的方法,它提供了通过其他方式查找连接的替代方案。它提供了一个非常好的系统来建立一组iPod/Touches之间的网络,并允许您定义关系是真正的对等还是主/从...


我正在设计一个移动自组织蓝牙网络,其中我将使用数据挖掘技术进行分布式计算任务。我不希望用户(即我)担心选择要连接的对等设备。我的计划是设置所有iPod Touch扫描所有可用的iPhone / iPod Touch设备,然后将任务卸载到每个设备上。当涉及到对等设备时,如果该对等设备已经“忙”于执行任务,则应自动转移到下一个对等设备。 - Josh Bradley
2
在这种情况下,构建客户端以自动接受邀请,并将整个过程视为主从关系。每个人都必须运行该应用程序才能使其正常工作,可以使用蓝牙或WiFi(尽管实际上可能可以基于通知进行操作,但如果应用程序尚未运行,则无法自动接受来自通知的应用程序启动)。 - Kendall Helmstetter Gelner
是的,那就是我的想法...在两个iPod设备之间建立连接后,接下来就是自动接受连接了。一旦一切都开始运行,我将有总共八个设备需要处理。 - Josh Bradley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接