iPhone - como os dados são transferidos em P2P
-
23-08-2019 - |
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
-
A conexão normal e mostrando uma caixa de diálogo com os pares
-
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
-
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
-
Quando é didChangeState chamado e para quem? Não deveria ser chamado para cada par quando eles estão conectados?
-
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.
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.