7

新しいiPhoneSDK3.0でピアを見つけるには、ピアピッカーを使用する必要がありますか?

あまり使いたくないのですが、ピアツーピアのBluetooth接続を使いたいです。ピアピッカーを使用せずにBluetooth接続を示すサンプルコードはありますか?Appleが提供するゲームGKTankはPeerPickerを使用しているので、私はそれを使用できません。

4

2 に答える 2

12

これを行うには2つの方法があります。

最初の方法はGameKitAPIを使用します。まず、2つの別々のクラスを用意します。1つはGKSessionDelegateプロトコルを実装し、GameKit / Bluetoothの「ハンドラー」として機能し、もう1つはプレゼンテーションUI(テーブルビューを備えたある種のビューコントローラー)として機能します。配線する方法は、ハンドラーが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);           
}

これを行う2番目の方法は、標準のBonjourサービス選択メカニズムを使用することです。GameKitはBonjour上に実装されているため(ただし、WiFiではなくBluetoothを介して)、2つの側が相互にネットワーク到達可能性を通過して接続されると、Bonjourに登録され、他のBonjourサービスと同じように動作します。GameKitの方法はおそらく少し簡単ですが、WiFiのコードが既にある場合は、Bluetoothにも再利用できます。

于 2009-06-26T15:19:39.030 に答える
-2

なぜ使いたくないのですか?

Bluetooth接続を自分で直接行う方法があるかどうかはわかりません。これは、他の方法で接続を見つけるための代替手段を提供します。これは、多数のiPod / Touchの間にネットワークをセットアップするための非常に優れたシステムを提供し、関係が本当にピアかマスター/スレーブかを定義できます...

于 2009-06-26T14:48:07.017 に答える