Pregunta

Estoy tratando de implementar una aplicación P2P. Lo que trato de hacer es transferir datos de un NSObject clases personalizadas entre los dispositivos. No soy capaz de averiguar cuando el método "receivedData" es invocado por GKSession.

Esto es lo que he hecho

  1. La conexión usual y que muestra un cuadro de diálogo con sus compañeros

  2. Cuando la aplicación recibe un cambio de estado de un compañero y el estado es Conectado, estoy enviando los datos a todos los compañeros (idealmente esto debería ser llamada cuando cada par acepta la conexión) utilizando métodos NSCoding

  3. En receivedData, estoy decodificación del NSData y volver a la instancia NSObject

El problema es la sesión: entre iguales: didChangeState: método no está recibiendo llamadas en ambos dispositivos. Simplemente se llama en el dispositivo que tocar en el botón "Conectar" en la alerta PeerPicker.

Preguntas

  1. Cuando se llama didChangeState y para quién? ¿No debería ser llamado para cada pares cuando están conectados?

  2. Cuando se la receivedData: método llamado y para quién? Cómo se llama para confirmar la recepción de un mensaje (apretón de manos) o simplemente para transmitir los datos enviados por otros compañeros?

Gracias por cualquier ayuda.

¿Fue útil?

Solución

Piense que es más como 'maestro / esclavo' en lugar de 'igual a igual'. Es de suponer que ambas partes se han establecido con GameKit y tenía sus delegados asignados. Por un lado, que inicia la conexión se notificó a través del valor de cambio de estado GKPeerStateConnected que el receptor ha aceptado la invitación y una conexión se ha hecho para que pueda empezar a enviar cosas más.

El lado de recepción, sin embargo, obtiene su primer aviso de que alguien quiere hablar con él a través del método didReceiveConnectionRequestFromPeer delegado. Se guarda la sesión para su uso posterior se da la vuelta y llamadas acceptConnectionFromPeer a aceptarlo. A partir de entonces, se hace todo lo que se envía a través de a través del método receiveData.

La mejor manera de hacer esto es tener un pequeño estado-máquina que maneja en qué estado se encuentra en cada lado. El remitente envía sólo cuando es llegado el caso GKPeerStateConnected. El receptor se pone en estado connected una vez que se acepta una solicitud de conexión de modo que pueda hacer cualquier configuración que tiene que hacer antes de que comience la obtención de datos.

Desde la abstracción de red se GKSession el receptor puede entonces dar la vuelta y utilizar la misma instancia de la sesión se puso en didReceiveConnectionRequestFromPeer y usarlo para escribir de nuevo al remitente (que debe tener su propio método receiveData llamada con las respuestas del receptor).

La única cosa a tener en cuenta es que hay un límite de tamaño de datos implícita en la memoria intermedia se puede enviar a través de GameKit. Es posible que desee experimentar para encontrar lo que es para su sistema (me da algo entre 5K y 10K - por alguna razón no varía). Es posible que desee tener código para dividir su NSData en trozos y gestionar packetizing / depacketizing los datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top