Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 游戏套件:GKSession手册_Iphone_Gamekit - Fatal编程技术网

Iphone 游戏套件:GKSession手册

Iphone 游戏套件:GKSession手册,iphone,gamekit,Iphone,Gamekit,我想使用GKSession连接两个设备,一个作为服务器启动,另一个作为客户端启动。使用此配置,我无法使用GKPeerPickerController 我在连接两个设备时遇到问题: 仅使用蓝牙:不可能 使用WiFi:设备之间至少有一些数据交换,但没有成功连接 在接口文件中,我有 GKSessionDelegate GKSession *session; 在实现中,我使用以下代码启动服务器: session = [[GKSession alloc] initWithSessionID:@"iF

我想使用GKSession连接两个设备,一个作为服务器启动,另一个作为客户端启动。使用此配置,我无法使用GKPeerPickerController

我在连接两个设备时遇到问题:

  • 仅使用蓝牙:不可能
  • 使用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;
客户端开始使用以下代码:

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

我还实施了这些呼吁:

-(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
我错过了什么

我确信这两个设备都启用了蓝牙并连接到同一个WiFi

谢谢


r、

我也遇到过类似的问题,但从上面的描述来看,我认为您正在做出一些改进 错误:

GKSession只执行BT;如果使用选择器,则可以提供 处理WiFi连接的单独方法

“didReceiveConnectionRequestFromPeer”方法应调用 会话对象上的“acceptConnectionFromPeer”方法 不要在您的代理上实现“acceptConnectionFromPeer”

对于调试,应该在委托方法中记录状态更改 “会话:对等方:didChangeState:” (见附件)。当同伴“可用”时,您 可以调用“connectToPeer:”;当“已连接”时,您可以使用“sendData:toPeers:”

对于IO,在建立连接后,您希望调用 会话上的“setDataReceiveHandler:withContext:”方法

早些时候,我的代码中有一些拼写错误,但现在可以正常工作了


祝你好运。

我想你错过了与客户的联系。收到“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”:


我希望这对您有所帮助。

您好,我已经实现了这些委托方法,但我没有将它们写入代码中。另外,我的session:peer:didChangeState在使用GKSession时从未收到调用,但在使用选择器时会收到调用。在我找到更多关于什么可能是错误的或者为什么它不起作用的信息之前,我正在使用GKPicker。。。谢谢,至少我知道我不是唯一一个…:-)关于,r.“GKSession仅实现BT”。。。这不是真的。@键入虽然现在是真的,但我相信在给出这个答案时,
GameKit
只支持蓝牙连接,您必须使用
CFNetwork
通过WiFi连接设备。更准确地说,“这不再是事实,因为
GameKit
现在支持WiFi连接。”我在4.0 betas期间使用了GameKit。GKSession一直支持Wifi和BT。我想你可能会想到苹果的GameKit用户界面套件,它只支持BT连接。如果您想使用Wifi,您必须创建自己的GKSession实例,但它确实“支持”它。仅供参考,您的GKSessionModelClient和GKSessionModelServer是交换的。