【问题标题】:GameKit in iPhone SDK 3.0iPhone SDK 3.0 中的 GameKit
【发布时间】:2010-11-06 04:05:12
【问题描述】:

我是否需要使用Peer Picker 在新的 iPhone SDK 3.0 中查找对等点?

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

【问题讨论】:

    标签: iphone bluetooth ipod-touch


    【解决方案1】:

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

    第一种方式使用 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 代码,它也可以用于蓝牙。

    【讨论】:

    • 嘿,非常感谢这个模板的构建。还有一个问题,我可以看到 session:peer:didChangeState 方法将如何进入 delegate.h/.m 文件,但是其他方法呢? startPeer 和 stopPeer 会放在我的 viewcontroller.h/.m 文件中,还是将整个模板放在委托文件中?
    • 在这种情况下,这些都假定在委托处理程序中,因为它们处理底层的 GameKit 管道。没有理由不能将其全部放在视图控制器中,但最好将 UI 代码与网络代码分离。更新对等点数组后,“处理程序”对象调用其自己的自定义委托方法“peerListChanged”,通知视图控制器列表已更改,以便它可以调用表重新加载并向用户显示新列表。
    • 这只能通过 Wifi 工作还是也能通过蓝牙找到对等点?是否必须使用对等选择器才能使用蓝牙?
    【解决方案2】:

    你为什么不想使用它?

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

    【讨论】:

    • 嗯,我正在设计一个移动自组织蓝牙网络,我将在其中使用数据挖掘技术执行分布式计算任务。我不希望用户(我)担心选择了要连接的对等方。我计划设置它,以便所有 iPod Touch 只扫描所有可用的 iPhone/iPod Touch 设备,然后将任务卸载到每个设备。当涉及到对等点时,如果对等点“忙”已经在执行任务,那么它应该自动转到下一个对等点。
    • 在这种情况下,构建客户端以自动接受邀请并将整个事情视为主从关系。每个人都必须运行该应用程序才能正常工作,蓝牙或 WiFi(尽管实际上您可以将它基于通知,但如果它尚未运行,则无法从通知中自动接受您的应用程序的启动)。
    • 是的,这就是我的想法……自动接受连接,这将是我第一次在两台 iPod touch 之间建立连接后的下一步。一切就绪后,我总共有 8 人可以使用。
    猜你喜欢
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多