6

GKSession を使用して 2 つのデバイスを接続し、一方をサーバーとして起動し、もう一方をクライアントとして起動したいと考えています。この構成を使用すると、GKPeerPickerController を使用できません。

2 つのデバイスの接続に問題があります。

  • ブルートゥースのみの使用:不可
  • WiFi の使用: 少なくともデバイス間でデータ交換が行われますが、正常に接続されません。

インターフェイスファイルには、

GKSessionDelegate
GKSession *session;

実装では、次のコードを使用してサーバーを起動します。

session = [[GKSession alloc] initWithSessionID:@"iFood"  displayName:nil sessionMode:GKSessionModeClient];
session.delegate = self;
session.available = YES;

クライアントは次のコードの使用を開始します。

session = [[GKSession alloc] initWithSessionID:@"iFood"  displayName:nil sessionMode:GKSessionModeServer];
session.delegate = self;
session.available = YES;

WiFi の代わりに Bluetooth を強制的に使用するにはどうすればよいですか?

また、これらの呼び出しを実装しました:

-(void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID {
NSLog(@"Someone is trying to connect"); 
}

- (BOOL)acceptConnectionFromPeer:(NSString *)peerID error:(NSError **)error {
NSLog(@"acceptConnectionFromPeer");
}

開始すると、これをデバッガーに取り込みます。

Listening on port 50775
2010-02-19 14:55:02.547 iFood[3009:5103] handleEvents started (2)

そして、他のデバイスが検索を開始すると、次のようになります。

~ DNSServiceBrowse callback: Ref=187f70, Flags=2, IFIndex=2 (name=[en0]), ErrorType=0 name=00eGs1R1A..Only by Audi regtype=_2c3mugr67ej6j7._udp. domain=local.
~ DNSServiceQueryRecord callback: Ref=17bd40, Flags=2, IFIndex=2 (name=[en0]), ErrorType=0 fullname=00eGs1R1A\.\.Only\032by\032Audi._2c3mugr67ej6j7._udp.local. rrtype=16 rrclass=1 rdlen=18 ttl=4500
** peer 1527211048: oldbusy=0, newbusy=0
~ DNSServiceBrowse callback: Ref=187f70, Flags=2, IFIndex=-3 (name=[]), ErrorType=0 name=00eGs1R1A..Only by Audi regtype=_2c3mugr67ej6j7._udp. domain=local.
GKPeer[186960] 1527211048 service count old=1 new=2
~ DNSServiceQueryRecord callback: Ref=17bd40, Flags=2, IFIndex=-3 (name=[]), ErrorType=0 fullname=00egs1r1a\.\.only\032by\032audi._2c3mugr67ej6j7._udp.local. rrtype=16 rrclass=1 rdlen=18 ttl=7200
** peer 1527211048: oldbusy=0, newbusy=0
~ DNSServiceBrowse callback: Ref=187f70, Flags=2, IFIndex=-3 (name=[]), ErrorType=0 name=00TF5kc1A..Only by Audi regtype=_2c3mugr67ej6j7._udp. domain=local.
~ DNSServiceQueryRecord callback: Ref=188320, Flags=2, IFIndex=-3 (name=[]), ErrorType=0 fullname=00tf5kc1a\.\.only\032by\032audi._2c3mugr67ej6j7._udp.local. rrtype=16 rrclass=1 rdlen=18 ttl=7200
** peer 1723356125: oldbusy=0, newbusy=0
~ DNSServiceQueryRecord callback: Ref=188320, Flags=2, IFIndex=2 (name=[en0]), ErrorType=0 fullname=00TF5kc1A\.\.Only\032by\032Audi._2c3mugr67ej6j7._udp.local. rrtype=16 rrclass=1 rdlen=18 ttl=4500
** peer 1723356125: oldbusy=0, newbusy=0

ここで何が欠けていますか?

両方のデバイスで Bluetooth が有効になっており、同じ WiFi に接続されていると確信しています。

ありがとう、

r.

4

2 に答える 2

1

クライアントとのつながりを受け入れるのを怠っていると思います。「didReceiveConnectionRequestFromPeer」コールバックを受信したら、次のようにクライアントとの接続を受け入れる必要があります。

-(void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID {
  NSLog(@"Someone is trying to connect"); 
  NSError *error;
  [gkSession acceptConnectionFromPeer:peerID error:&error];
  if(error)
    NSLog(@"Error on accept connection with peer: ", error);
}

この後、ここで「GKPeerStateConnected」を受け取ります。

- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state{}

これがお役に立てば幸いです。

于 2013-01-07T14:12:58.403 に答える
-1

私も同様の問題を抱えていましたが、上記の説明から、あなたはいくつかの誤りを犯していると思います:

GKSessionはBTのみを実装します。ピッカーを使用する場合は、WiFi接続を処理するための個別の方法を提供できます。

「didReceiveConnectionRequestFromPeer 」メソッドは、セッションオブジェクトの「acceptConnectionFromPeer」メソッドを呼び出す必要があります。デリゲートに「acceptConnectionFromPeer」を実装しないでください。

デバッグするには、デリゲートメソッド「session:peer:didChangeState:」で状態の変化をログに記録する必要があります(http://developer.apple.com/iPhone/library/documentation/GameKit/Reference/GKSessionDelegate_Protocol/Reference/Reference.htmlを参照) 。 。ピアが「Available」の場合、「connectToPeer:」を呼び出すことができます。「接続済み」の場合は、「sendData:toPeers:」を使用できます。

接続を確立した後のIOの場合、セッションで「setDataReceiveHandler:withContext:」メソッドを呼び出す必要があります。

以前、コードにタイプミスがありましたが、現在は機能しています。

幸運を。

于 2010-02-21T07:33:52.257 に答える