Фактически получен ответ через вопрос об обновлении 01/03/2012, но этот текст перенесен в раздел ответов
Я хотел бы поделиться тем, как я реализовал запрос на отключение, отправленный с сервера на клиент,Весь код, представленный ниже, содержится в классе, который я создал, чтобы полностью инкапсулировать весь интерфейс с экземпляром GKSession (также реализует методы GKSessionDelegate).
Сначала сервер отправляет запрос на отключение клиенту, которыйдолжен быть отключен.Любые данные, которые отправляются с клиента на сервер или наоборот, содержатся в словаре, в котором также есть пара ключ-значение для указания типа отправляемых данных (в данном случае это запрос на отключение).
- (void)sendDisconnectRequestToPeer:(NSString *)peer {
//create the data dictionary that includes the disconnect value for the data type key
NSMutableDictionary *dictPrvw = [[NSMutableDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithInt:GKSessionDataTypeDisconnect], kDictKeyDataType, nil];
NSData *dataChunk = [[NSKeyedArchiver archivedDataWithRootObject:dictPrvw] retain];
//[self printDict:dictPrvw];
NSArray *peers = [[NSArray alloc] initWithObjects:peer, nil];
[self sendData:dataChunk toPeers:peers];
[dataChunk release];
[dictPrvw release];
}
Клиент получает данные, преобразует их в словарь и проверяет пару ключ-значение, которая указывает, какой тип данных был отправлен.Если это запрос на отключение, мой класс «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;
}
Пользователь никогда не видит запрос на отключение и поэтому не может контролировать, отклонять его или нет.
Надеюсь, эта информация поможет.Я понимаю, что я написал не совсем ясно, и я оставил много другого кода (намеренно), поэтому не стесняйтесь комментировать или задавать вопросы.