GKSession 问题 - Objective-C GameKit

Posted

技术标签:

【中文标题】GKSession 问题 - Objective-C GameKit【英文标题】:GKSession Problems - Objective-C GameKit 【发布时间】:2009-06-30 14:30:48 【问题描述】:

好的,我一直在尝试创建自己的 GKSession 对象,而委托方法在控制台中给了我一个错误,我还没有弄清楚如何修复。我想知道是否有人有任何建议或遇到过这个问题? *请注意 - 变量 peerStatus 在我的代码中的其他地方定义。对等点可以被赋予“kServer”或“kClient”的状态。我宁愿将每个都定义在 GKSessionModeServer 或 GKSessionModeClient 中,因为我已经阅读过,如果对等点位于 GKSessionModePeer 中,则性能时间实际上会更慢,因为它必须同时完成客户端和服务器的工作。

- (GKSession *)peerPickerController:(GKPeerPickerController *)picker sessionForConnectionType:(GKPeerPickerConnectionType)type 
    if (peerStatus == kServer) 
        GKSession *session = [[GKSession alloc] initWithSessionID:@"Josh_Land" displayName:nil sessionMode:GKSessionModeServer];
        return [session autorelease];
    
    else 
        GKSession *session = [[GKSession alloc] initWithSessionID:@"Josh_Land" displayName:nil sessionMode:GKSessionModeClient];
        return [session autorelease]; 
    

整个错误代码是:

监听端口 56386 2009-06-30 10:31:41.892 GKTank[17756:20b] *** 由于未捕获的异常“GKInvalidArgumentException”而终止应用程序,原因:“必须提供具有 GKSessionModePeer 模式的有效 GKSession 对象,或创建默认 GKSession对象在 -peerPickerController:sessionForConnectionType: 的实现中返回“nil”。提供的对象是:发送 0 个数据包:rush(0 个数据包 0 字节):依赖(0 个数据包 0 字节):rtry(0 个数据包 0 字节):sack(0 个数据包 0 字节):当前加权平均 rtt(0 毫秒)会话模式:0' 2009-06-30 10:31:41.893 GKTank [17756:20b] 堆栈:( 807902715, 2452446779, 807986683, 807986522, 927035842, 927037074, 927038407, 815223834, 927038949, 9245, 8562, 814709201, 815110321, 815119058, 815114270, 814813151, 814722763, 814748641, 839148405, 807687520, 807683624, 839142449, 839142646, 814752238 )

【问题讨论】:

如果您发布您遇到的错误将会很有帮助。 对不起,我现在用错误代码编辑了帖子。如果我为两者运行将 GKSession 配置为 GKSessionModePeer,它实际上是有效的,但我试图远离这种情况。我宁愿将会话指定为服务器模式或客户端模式。我想知道现在这是否可能(它刚刚出现的地方,代码中可能有一些错误吗??)还是我的代码? 我也不知道答案,但你有没有测试过它是否真的变慢了?如果您只是阅读它的速度较慢,但​​实际上并没有看到它对性能的影响,那么这很可能是过早的优化。也就是说,看看你的测试出了什么问题会很有趣。 【参考方案1】:

我实际上还没有使用 GameKit 实现任何东西,但只是查看文档,看起来你只能在使用 GKSessionModePeer 时使用 GKPeerPickerController。如果您想使用 GKSessionModeServer/Client,您需要直接使用会话及其委托。请参阅游戏工具包编程指南中关于Implementing a Server 和Connecting to a Service 的部分。

您的主要功能将围绕 GKSessionDelegate 方法 -session:peer:didChangeState: 在客户端和服务器模式下,-acceptConnectionFromPeer:error:-denyConnectionFromPeer: 在服务器模式下。

【讨论】:

以上是关于GKSession 问题 - Objective-C GameKit的主要内容,如果未能解决你的问题,请参考以下文章

GameKit (GKSession) : GKSession 决定使用 Wifi 或蓝牙时是不是有优先顺序(如果两者都可用)

GKSession displayNameForPeer 防止释放会话(iOS 4.0、4.1)

在 iPhone 中每 60 秒调用一次方法

多点连接 - 以编程方式断开对等点

IOS同步音乐流媒体

objective-c中按钮的点击问题……