Как: реализовать принудительное отключение сервера от клиента в GKSession - PullRequest
1 голос
/ 20 апреля 2011

Я внедряю режим сервера / клиента GKSession в моем приложении на iOS.Я нашел один вопрос, связанный с моим , но без ответа.Я пытаюсь разрешить серверу отключить любого клиента, который в данный момент подключен к сеансу.Я думал, что вызов DisnectPeerFromAllPeers: (NSString *) peerID позволит мне сделать это, но, похоже, не имеет никакого эффекта.

1 Ответ

0 голосов
/ 13 апреля 2018

Фактически получен ответ через вопрос об обновлении 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;
}

Пользователь никогда не видит запрос на отключение и поэтому не может контролировать, отклонять его или нет.

Надеюсь, эта информация поможет.Я понимаю, что я написал не совсем ясно, и я оставил много другого кода (намеренно), поэтому не стесняйтесь комментировать или задавать вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...