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.
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
@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
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