Objective c 如何:在GKSession中实现服务器强制断开客户端连接

Objective c 如何:在GKSession中实现服务器强制断开客户端连接,objective-c,ios,gksession,Objective C,Ios,Gksession,我正在iOS上的应用程序中实现GKSession服务器/客户端模式操作。我找到了一个,但没有回答。我正在尝试允许服务器断开当前连接到会话的任何客户端。我认为调用disconnectPeerFromAllPeers:(NSString*)peerID可以让我这样做,但它似乎没有效果 有什么建议吗 谢谢通过2012年3月1日的问题更新实际回答,但将此文本移到了回答部分 我想分享我是如何实现从服务器发送到客户端的断开连接请求的。下面给出的所有代码都包含在一个类中,我创建该类是为了完全封装与GKSess

我正在iOS上的应用程序中实现GKSession服务器/客户端模式操作。我找到了一个,但没有回答。我正在尝试允许服务器断开当前连接到会话的任何客户端。我认为调用disconnectPeerFromAllPeers:(NSString*)peerID可以让我这样做,但它似乎没有效果

有什么建议吗

谢谢

通过2012年3月1日的问题更新实际回答,但将此文本移到了回答部分

我想分享我是如何实现从服务器发送到客户端的断开连接请求的。下面给出的所有代码都包含在一个类中,我创建该类是为了完全封装与GKSession实例的所有接口(还实现了GKSessionLegate方法)

首先,我让服务器向应断开连接的客户端发送断开连接请求。从客户端发送到服务器或从客户端发送到服务器的任何数据都包含在一个字典中,该字典还具有一个键值对,用于指定发送的数据类型(在这种情况下,数据是一个断开连接请求)

客户端接收数据,将其强制转换到字典中,并检查指定发送的数据类型的键值对。如果是断开连接请求,那么我的“GKSessionManager”类将实现断开连接

- (void)recievedAllDataChunksInSession:(GKSession *)session fromPeer:(NSString *)peer context:(void *)context {

//The chunk was packaged by the other user using an NSKeyedArchiver, 
//so unpackage it here with our NSKeyedUnArchiver
NSMutableDictionary *responseDictionary = (NSMutableDictionary *)[[NSKeyedUnarchiver unarchiveObjectWithData:self.recievedPackets] mutableCopyWithZone:NULL];

//[self printDict:responseDictionary];

//get the enumerator value for the data type
NSNumber *gkSessDataType = [responseDictionary objectForKey:kDictKeyDataType];
int intDataType = [gkSessDataType intValue];

UIAlertView *anAlrtVw;

switch (intDataType) {
    case GKSessionDataTypeMessageData:
        [self sessionManager:self recievedDataDictionary:responseDictionary];
        break;

    case GKSessionDataTypePreviewRequest:
        if (sess.sessionMode == GKSessionModeServer) {
            [self sendMsgPreviewToPeer:peer];
        }
        break;

    case GKSessionDataTypePreviewSend:
        //[self sessionManager:self recievedDataDictionary:responseDictionary];
        [self sessionManager:self connectedWithPrelimData:responseDictionary];
        break;

    case GKSessionDataTypeDisconnect:
        anAlrtVw = [[UIAlertView alloc] 
                    initWithTitle:nil 
                    message:@"The server has disconnect you." 
                    delegate:self cancelButtonTitle:@"OK" 
                    otherButtonTitles:nil];
        [anAlrtVw show];
        [anAlrtVw release];
        [self closeSession];
        [self disconnectedByServer];

    default:
        break;

}
}


- (void)closeSession {
  [sess disconnectFromAllPeers];
  [sess setDataReceiveHandler: nil withContext: NULL];
  sess.available = NO; 
  sess.delegate = nil;
  self.sess = nil;
  self.serverId = nil;
  self.rqstPeerId = nil;
  serverIsConnecting = NO;
}
用户从未看到断开连接请求,因此无法控制是否拒绝该请求


希望这些信息有帮助。我意识到我写的代码并不完全清楚,而且我还特意遗漏了很多其他代码,所以请随意评论或提问。

我想补充一点,我也有同样的问题。disconnectPeerFromAllPeers:似乎不起作用。@monkeydom,很抱歉我之前没有看到这篇文章。我通过让服务器以数据字典的形式向对等方发送请求来实现对等方的断开。我用解释和示例代码更新了我的帖子。@JonnyB:你可以回答自己的问题并接受这个答案。
- (void)recievedAllDataChunksInSession:(GKSession *)session fromPeer:(NSString *)peer context:(void *)context {

//The chunk was packaged by the other user using an NSKeyedArchiver, 
//so unpackage it here with our NSKeyedUnArchiver
NSMutableDictionary *responseDictionary = (NSMutableDictionary *)[[NSKeyedUnarchiver unarchiveObjectWithData:self.recievedPackets] mutableCopyWithZone:NULL];

//[self printDict:responseDictionary];

//get the enumerator value for the data type
NSNumber *gkSessDataType = [responseDictionary objectForKey:kDictKeyDataType];
int intDataType = [gkSessDataType intValue];

UIAlertView *anAlrtVw;

switch (intDataType) {
    case GKSessionDataTypeMessageData:
        [self sessionManager:self recievedDataDictionary:responseDictionary];
        break;

    case GKSessionDataTypePreviewRequest:
        if (sess.sessionMode == GKSessionModeServer) {
            [self sendMsgPreviewToPeer:peer];
        }
        break;

    case GKSessionDataTypePreviewSend:
        //[self sessionManager:self recievedDataDictionary:responseDictionary];
        [self sessionManager:self connectedWithPrelimData:responseDictionary];
        break;

    case GKSessionDataTypeDisconnect:
        anAlrtVw = [[UIAlertView alloc] 
                    initWithTitle:nil 
                    message:@"The server has disconnect you." 
                    delegate:self cancelButtonTitle:@"OK" 
                    otherButtonTitles:nil];
        [anAlrtVw show];
        [anAlrtVw release];
        [self closeSession];
        [self disconnectedByServer];

    default:
        break;

}
}


- (void)closeSession {
  [sess disconnectFromAllPeers];
  [sess setDataReceiveHandler: nil withContext: NULL];
  sess.available = NO; 
  sess.delegate = nil;
  self.sess = nil;
  self.serverId = nil;
  self.rqstPeerId = nil;
  serverIsConnecting = NO;
}