2017-10-17 4 views
1

Pour éviter d'être un problème XY, je vais d'abord expliquer la situation.Comment puis-je détecter une déconnexion non programmatique de la session MCSession du périphérique en cours?

Je développe un jeu dans lequel plusieurs appareils peuvent se connecter les uns aux autres pour avoir une partie multijoueur. J'utilise Multipeer Connectivity pour cela. Le jeu prend en charge 2-4 joueurs.

Maintenant, je dois gérer le cas d'un joueur qui se déconnecte de tous les autres joueurs. Le jeu devrait continuer quand un joueur se déconnecte, à moins qu'il ne reste qu'un seul joueur. Cependant, je veux qu'une alerte soit montrée à tous les joueurs encore connectés disant "XXX s'est déconnecté" et "tue" le joueur qui s'est déconnecté, et une autre alerte au joueur déconnecté disant "You déconnecté" et rejetant le Game View Controller .

Le joueur peut se déconnecter de la manière suivante:

  • appuyant sur le Quit
  • éteindre l'écran (ce qui rend l'application va en arrière-plan qui arrête apparemment tous Mutipeer Connectivité)
  • Activation mode Avion
  • Obtenir trop loin des autres

Tout APAR t de la première manière ne peut pas être contrôlée par programme. Je peux actuellement implémenter le premier comme ceci:

Lorsque l'utilisateur appuie sur le bouton de quitter, juste après que session.disconnect() soit appelée, je peux montrer le message "Vous vous êtes déconnecté". En sessionPeerDidChangeState méthode de délégué, je peux détecter qu'un joueur s'est déconnecté et je peux montrer "XXX déconnecté" alerte là.

Cependant, je n'arrive pas à comprendre comment gérer les autres cas. Au cours de mes propres tests, j'ai découvert que si l'utilisateur éteint leur écran, la méthode de délégué sessionPeerDidChangeState n'est même pas appelée. Même si on l'appelle, comment suis-je supposé savoir si l'appareil est déconnecté ou non? J'ai besoin de le savoir pour montrer un message approprié et décider de "tuer" ou non le joueur qui s'est déconnecté.

Je comprends que ce n'est pas possible avec une session composée de 2 pairs, puisqu'il est impossible de déterminer "qui se déconnecte de qui". Le jeu ne peut pas continuer avec seulement 1 joueur de toute façon, donc je vais juste montrer l'alerte "Tous les autres joueurs sont partis" et fermer le Game View Controller si je vois que self.session.connectedPeers est vide. Je suis seulement préoccupé par le cas où il y a 3 joueurs et 1 d'entre eux à gauche. Je devrais être capable de savoir quel joueur est déconnecté, mais je ne sais pas comment.

+0

pour le second, ne pouvez-vous pas utiliser 'applicationDidEnterBackground'?Pour vérifier le mode avion voir ce fil ici https://stackoverflow.com/questions/4804398/detect-airplane-mode-on-ios et faire usage des délégués pour vérifier s'ils l'ont éteint ou allumé. Quant à vous éloigner des autres, voulez-vous dire physiquement? ou dans le jeu? si c'est le premier alors je ne suis pas trop sûr d'écouter en permanence l'emplacement des autres personnes – TNguyen

+0

@TNguyen Je sais que cela existe mais la liste des façons de se déconnecter n'est pas limitée à ce que j'ai dans la question. Je ne pense pas que je puisse gérer tous les cas. Je cherche un moyen de détecter une déconnexion, peu importe la raison. – Sweeper

+0

Pouvez-vous nous indiquer comment vous connectez les joueurs, par exemple si vous avez 3 joueurs, est-ce que l'un des joueurs joue le rôle de 'Browser (MCNearbyServiceBrowser)' et d'autres 'Advertisers (MCNearbyServiceAdvertiser)'? Ou est-ce que vous le faites d'une autre manière? – Ladislav

Répondre

2

Disons que vous avez 3 pairs connectés (pair 1, pair 2 et pair 3). Disons que peer 3 tourne en mode avion. L'homologue 1 et l'homologue 2 recevraient un appel de délégué sessionPeerDidChangeState que l'homologue 3 a déconnecté. Mais les pairs 1 et 2 ont toujours une connexion entre eux (donc les deux auront self.session.connectedPeers == 1). D'autre part, l'homologue 3 verra que l'homologue 1 et l'homologue 2 sont déconnectés l'un après l'autre et self.session.connectedPeers == 0 et donc l'homologue 3 peut supposer que c'est lui qui a perdu la connexion.

Et comme indiqué dans la question si le bouton d'accueil est enfoncé que vous pouvez vous déconnecter de la session dans applicationDidEnterBackground.