Question

Je suis en train de mettre en œuvre une application P2P. Ce que j'essaie de faire est de transférer les données d'une classe NSObject personnalisée entre les appareils. Je ne suis pas en mesure de savoir quand la méthode « receivedData » est invoquée par GKSession.

Voici ce que je l'ai fait

  1. La connexion habituelle et en montrant une boîte de dialogue avec leurs pairs

  2. Lorsque l'application reçoit un changement d'état d'un pair et l'état est connecté, je vous envoie les données à tous les pairs (idéalement cela devrait être appelé lorsque chaque pair accepte la connexion) en utilisant des méthodes NSCoding

  3. Dans receivedData, je décoder les NSData et revenir l'instance NSObject

Le problème est le session: les pairs: didChangeState: méthode n'est pas appelé sur les deux appareils. Il se vient d'appeler sur le dispositif qui tapé sur le bouton « Connect » dans l'alerte PeerPicker.

Questions

  1. Quand didChangeState appelé et pour qui? Il ne devrait pas être appelé à chaque pair quand ils sont connectés?

  2. Quand la receivedData: méthode appelée et pour qui? Est-il appelé à confirmer la réception d'un message (poignée de main) ou tout simplement pour transmettre les données envoyées par d'autres pairs?

Merci pour toute aide.

Était-ce utile?

La solution

Pensez plus comme « maître / esclave » au lieu de « peer to peer ». On peut supposer que les deux parties ont été mis en place avec GameKit et avaient leurs délégués assignés. D'un côté qui initie la connexion est notifié par l'état GKPeerStateConnected valeur de changement que le récepteur a accepté l'invitation et une connexion a été fait pour qu'il puisse commencer à envoyer des choses sur.

Le côté réception, cependant, obtient son premier avis que quelqu'un veut parler à travers la méthode de délégué didReceiveConnectionRequestFromPeer. Il enregistre la session pour une utilisation ultérieure tourne alors autour et appels acceptConnectionFromPeer à l'accepter. A partir de là, il obtient tout ce qui est envoyé sur la méthode par receiveData.

La meilleure façon de le faire est d'avoir un peu machine d'état qui gère quel état de chaque côté est. L'expéditeur envoie seulement quand il est obtenu l'événement GKPeerStateConnected. Le récepteur est mis en état connected une fois qu'il accepte une demande de connexion de sorte qu'il peut faire toute la configuration qu'il doit faire avant de commencer à obtenir des données.

Depuis l'abstraction réseau est GKSession le récepteur peut alors tourner autour et utiliser la même instance de session, il a en didReceiveConnectionRequestFromPeer et l'utiliser pour écrire à l'expéditeur (qui devrait avoir sa propre méthode de receiveData appelé les réponses du récepteur).

La seule chose à garder à l'esprit est qu'il ya une limite de taille des données implicites sur le tampon que vous pouvez envoyer par GameKit. Vous pouvez expérimenter pour trouver ce qui est de votre système (je reçois quelque chose entre 5 km et 10 km - pour une raison quelconque, il varie). Vous pouvez avoir le code de diviser votre NSData en morceaux et de gérer la mise en paquets / dépaqueter les données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top