Pergunta

Eu estou tentando implementar uma aplicação P2P. O que eu tento fazer é transferir os dados de um costume da classe NSObject entre os dispositivos. Eu não sou capaz de descobrir quando o método "receivedData" é invocado por GKSession.

Aqui está o que eu fiz

  1. A conexão normal e mostrando uma caixa de diálogo com os pares

  2. Quando o aplicativo recebe uma alteração de estado para um ponto e o estado está ligado, estou enviando os dados para todos os pares (idealmente este deve ser chamado quando cada peer aceita a conexão) usando métodos NSCoding

  3. Em receivedData, estou decodificar o NSData e voltar a instância NSObject

O problema é o sessão: pares: didChangeState: método não está sendo chamado em ambos os dispositivos. Ele só é chamado no dispositivo que bateu o botão "Connect" no alerta PeerPicker.

Perguntas

  1. Quando é didChangeState chamado e para quem? Não deveria ser chamado para cada par quando eles estão conectados?

  2. Quando é o receivedData: método chamado e para quem? É chamado para confirmar o recebimento de uma mensagem (handshake) ou apenas para transmitir os dados enviados por outros pares?

Obrigado por qualquer ajuda.

Foi útil?

Solução

Pense nisso mais como 'master / slave' em vez de 'peer to peer'. Presumivelmente ambos os lados foram criadas com GameKit e teve seus delegados atribuído. A um lado que inicia a conexão é notificado via o valor de mudança de estado GKPeerStateConnected que o receptor aceitou o convite e uma ligação foi feita para que ele possa começar a enviar coisas mais.

O lado de recepção, no entanto, recebe o seu primeiro aviso de que alguém quer falar com ele através do método didReceiveConnectionRequestFromPeer delegado. Ele salva a sessão para uso posterior, em seguida, se vira e chamadas acceptConnectionFromPeer a aceitá-la. A partir de então, torna-se tudo o que é enviado através através do método receiveData.

A melhor maneira de fazer isso é ter um pouco de estado-máquina que gerencia o estado de cada lado está. O remetente envia apenas quando é chegado o evento GKPeerStateConnected. O receptor é colocado em estado connected uma vez que aceita uma solicitação de conexão para que ele possa fazer qualquer configuração que precisa fazer antes de começar a obtenção de dados.

Uma vez que a abstração de rede é GKSession o receptor pode, em seguida, vire-se e usar a mesma instância sessão ficou em didReceiveConnectionRequestFromPeer e usá-lo para escrever de volta para o remetente (que deve ter seu próprio método receiveData chamado com respostas do receptor).

A única coisa a ter em mente é que não há um limite de tamanho de dados implícita no buffer você pode enviar através GameKit. Você pode querer experimentar para encontrar o que é para o seu sistema (I obter algo entre 5K e 10K - por algum motivo ela varia). Você pode querer ter código para dividir o seu NSData em pedaços e gerenciar packetizing / depacketizing os dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top