Async UDP Socket tuyau cassé après le verrouillage du téléphone avec l'application suspendue en arrière-plan

StackOverflow https://stackoverflow.com/questions/6377950

Question

J'utilise la bibliothèque tierce AsyncUDPSocket dans mon application iPhone et pour la plupart en partie cela fonctionne très bien. J'ai une instance singleton d'un AsyncUDPSocket que j'utilise pour tout mon trafic réseau. Mon application est enregistrée pour le suivi de l'emplacement en arrière-plan et se réveillera et enverra des paquets de mise à jour de l'emplacement sur le réseau tout en s'exécutant en arrière-plan. Tout cela fonctionne parfaitement en arrière-plan, au premier plan, sur le téléphone verrouillé ou déverrouillé, sauf lorsque je fais ce qui suit:

  1. Démarrer mon application
  2. Désactiver le suivi de la position dans les paramètres de mon application (donc pas de réveil d'arrière-plan)
  3. Appuyez sur le bouton d'accueil (l'application passe en arrière-plan, le socket est «lyophilisé» avec le reste de l'application)
  4. Verrouiller le téléphone
  5. Déverrouiller le téléphone
  6. Reprendre l'application
  7. Tentative de redémarrage du suivi et envoi de quelque chose par le socket. Dès que j'essaye, j'obtiens une erreur SIGPIPE / EPIPE et l'application plante.

J'ai pensé que le meilleur moyen de gérer cela serait de fermer et de libérer le socket chaque fois que l'application se termine et que le suivi en arrière-plan n'est pas activé, mais lorsque j'essaye [socket close] ou [socket release] sur le AsyncUDPSocket, j'obtiens diverses erreurs EXC_BAD_ACCESS. J'ai déposé un bogue auprès de l'équipe de développement, mais je me demandais si quelqu'un ici pouvait donner des idées sur la façon d'éviter complètement l'erreur SIGPIPE ou sur d'autres moyens de maintenir le socket en vie sans le libérer. Merci.

Était-ce utile?

La solution 2

Juste au cas où quelqu'un serait curieux (ce qui, à en juger par les statistiques de cette question, ce n'est pas le cas), je n'ai pas été en mesure de déterminer ce qui causait l'erreur SIGPIPE, mais j'ai finalement résolu mes problèmes de gestion de la mémoire (qui étaient dus àune implémentation défectueuse de onUdpSocketDidClose dans mon délégué) afin que je puisse réinitialiser le socket à chaque redémarrage de l'application.

Autres conseils

Excellente observation - oui, il semble qu'après avoir envoyé la tâche en arrière-plan, puis verrouillé le téléphone, les prises sont abandonnées et la prochaine fois que vous essayez de l'utiliser, on est matraqué avec un SIGPIPE.

Idées pour y faire face ici: Plantage SIGPIPE lors du changement de tâche en arrière-plan (il est soit défini ignore pour SIGPIPE pour l'ensemble de l'application, soit pour le socket, soit fournit un hanler pour cela)

ps.aussi - il semble que le réglage d'ignorer SIGPIPE ne fonctionne pas avec le débogueur attaché, alors comparez avec et sans.

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