43 votes

Comment une application iOS peut-elle conserver une connexion TCP indéfiniment en arrière-plan?

Une application iPhone, connexion à un serveur distant via le protocole TCP. Les scénarios d'utilisation sont:

  1. application (utilisateur) envoie des données au serveur et le serveur répond en retour les données.
  2. serveur peut envoyer des données à l'application alors qu'il ne fait rien.

Supposons que si l'application n'envoie pas de données au serveur pour 30 minutes, le serveur va fermer la connexion. Je veux garder la connexion active pendant 120 minutes, même si l'utilisateur ne fait rien.

Cas 1: si l'application est au premier plan, je peux utiliser la minuterie à envoyer certains de ne rien données au serveur. Pas de problème.

Cas 2: si l'utilisateur a appuyé sur la Maison et l'app est allé à fond, que pouvais-je faire? Je n'ai pas wan pour afficher une alerte ou quelque chose d'interrompre l'utilisateur(il est absent ou jouer à des jeux). Je veux juste garder la connexion pour une période plus longue lorsque l'utilisateur revient à l'application, il a découvert que la connexion sera encore en vie et d'être heureux.

J'ai lu les documentations à propos exécution en arrière-plan, le multitâche, les locaux et les notifications de l'iphone Api. Je ne suis pas sûr que si je peux atteindre le Cas 2.

Utilisez uniquement juridique Api, pas de jailbreak.

24voto

Nick Points 6350

Tapbots a résolu ce problème avec Pastebot en invitant l'utilisateur à exécuter un fond silencieux piste audio à tout moment.

Notez qu'Apple fronce les sourcils sur l'utilisation de hacks comme employant l'audio d'arrière-plan ou VOIP Api pour garder non audio ou VOIP applications en cours d'exécution (comme en témoigne la "solution de contournement" décrites dans l'article ci-dessus), de sorte à barboter avec ces techniques, les risques de rejet au moment de la soumission.

Malheureusement, il n'y a pas d'API pour garder une connexion vivant dans l'arrière-plan. Peut-être qu'ils vont introduire un dans une future mise à jour d'iOS, mais vous pourriez envisager de soumettre une demande de fonctionnalité pour la voix de votre soutien.

15voto

Nick Weaver Points 30418

Jetez un oeil à la mise en Œuvre d'une Application de la VoIP dans Apple iOS l'Application Guide de Programmation. Ce n'est pas une solution testée, mais je pense qu'il peut être utilisé pour obtenir ce que vous demandez.

Mise en œuvre d'une Application de la VoIP

Une Voice over Internet Protocol (VoIP) l'application permet à l'utilisateur de faire les appels téléphoniques à l'aide d'un Internet connexion au lieu de l'appareil le service cellulaire. Une telle demande pour maintenir un réseau permanent la connexion à son service associé de sorte qu'il peut recevoir des appels entrants et d'autres données pertinentes. Plutôt que de garder les applications VoIP éveillé toute la le temps, le système leur permet d'être suspendu et offre des facilités pour la surveillance de leurs supports pour eux. Lorsque le trafic entrant est détecté, l' système réveille l'application de la VoIP et retourne le contrôle de ses prises c'.

Je ne suis pas sûr si vous développez une application VoIP, mais vous serez en mesure d'accéder à la sockets et réagir sur les paquets entrants. Le texte après la citation renvoie à l' [setKeepAliveTimeout:handler:][2] qui vous permet de définir un bloc de code qui vous permet de garder en vie un(VoIP) de connexion. Minimum de planification de temps est de 10 minutes, si.

Dans la mise en Œuvre d'une Application de la VoIP est un paragraphe sur l'Installation d'un Keep-Alive Gestionnaire. Je suis curieux de savoir si cela va aider. Merci de nous donner une note si cela a résolu votre problème.

5voto

Gowtham R Points 95

1.Créez votre socket avec la propriété VOIP comme ceci

 [inputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ;

[outputStream  setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ;
 

2.Ajouter le mode d'arrière-plan requis en tant que "L'application fournit des services de voix sur IP" dans app.plist

Si votre application en mode arrière-plan, la prise VoIP ne se fermera pas. Vous pouvez obtenir cette notification avec uilocal notification.

"Si votre application n'est pas une application d'application voip d'origine, elle sera rejetée"

3voto

adam Points 10572

Lorsque l'application est au premier plan:

Regarder STOMP http://stomp.codehaus.org/Protocol

L'amortisseur de Cadre en Obj-C http://code.google.com/p/stompframework/

et le courtier ActiveMQ http://activemq.apache.org/

Pour quand l'application est en arrière-plan je serais probablement aller pour l'utilisation de l'APN (Notifications) pour inviter l'utilisateur à réveiller l'application à nouveau...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X