5

好的,我一直在尝试创建自己的 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 对象,或在 -peerPickerController:sessionForConnectionType: 的实现中创建一个默认的 GKSession 对象 return '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,

4

1 回答 1

7

我实际上还没有使用 GameKit 实现任何东西,但只是查看文档,看起来你只能在使用 GKSessionModePeer 时使用 GKPeerPickerController。如果您想使用 GKSessionModeServer/Client,您需要直接使用会话及其委托。请参阅 Game Kit 编程指南中关于实现服务器连接到服务的部分。

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

于 2009-06-30T17:36:48.420 回答