web-dev-qa-db-fra.com

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

Une application iPhone, se connectant à un serveur distant via TCP. Les scénarios d'utilisation sont les suivants:

  1. l'application (utilisateur) envoie des données au serveur et le serveur répond aux données.
  2. le 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 pendant 30 minutes, le serveur fermera la connexion. Je souhaite maintenir 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 le minuteur pour envoyer des données de ne rien faire au serveur. Aucun problème.

Cas 2: si l'utilisateur appuie sur Accueil et que l'application passe en arrière-plan, que puis-je faire? Je ne veux pas montrer d'alerte ou quelque chose pour interrompre l'utilisateur (il est absent ou joue à des jeux). Je veux juste garder la connexion vivante pendant une plus longue période et lorsque l'utilisateur revient à l'application, il a découvert que la connexion sera toujours vivante et en sera heureuse.

J'ai lu des documentations sur l'exécution en arrière-plan, le multitâche et les notifications locales des API iphone. Je ne sais pas si je peux atteindre le cas 2.

N'utilisez que des API légales, pas de jailbreak.

42
yehnan

Tapbots a résolu ce problème avec Pastebot en invitant l'utilisateur à exécuter à tout moment une piste audio d'arrière-plan silencieuse .

Notez que Apple fronce les sourcils sur l'utilisation de hacks comme l'utilisation de l'audio d'arrière-plan ou des API VOIP pour maintenir les applications non audio ou VOIP en cours d'exécution (comme en témoigne la `` solution de contournement '' décrite dans l'article ci-dessus)). risque de rejet au moment de la soumission.

Malheureusement, il n'y a pas d'API légale pour maintenir une connexion active en arrière-plan. Peut-être qu'ils en introduiront une dans une future mise à jour d'iOS, mais vous pourriez envisager de soumettre un demande de fonctionnalité pour exprimer votre soutien.

24
Nick

Veuillez consulter Implémentation d'une application VoIP dans le Guide de programmation d'applications iOS d'Apple. Ce n'est pas une solution testée, mais je pense qu'elle peut être utilisée pour réaliser ce que vous demandez.

Implémentation d'une application VoIP

Une application Voice over Internet Protocol (VoIP) permet à l'utilisateur de passer des appels téléphoniques à l'aide d'une connexion Internet au lieu du service cellulaire de l'appareil. Une telle application doit maintenir une connexion réseau persistante à son service associé afin de pouvoir recevoir des appels entrants et d'autres données pertinentes. Plutôt que de garder les applications VoIP éveillées tout le temps, le système permet de les suspendre et fournit des installations pour surveiller leurs sockets pour elles. Lorsque le trafic entrant est détecté, le système réveille l'application VoIP et lui rend le contrôle de ses sockets.

Je ne sais pas si vous développez une application VoIP, mais vous pourrez accéder aux sockets et réagir aux paquets entrants. Le texte après la citation fait référence à [setKeepAliveTimeout:handler:][2] qui vous permet de définir un bloc de code qui vous permet de maintenir en vie une connexion (votre VoIP). Cependant, le temps de planification minimum est de 10 minutes.

Dans la mise en œuvre d'une application VoIP est un paragraphe sur l'installation d'un gestionnaire Keep-Alive . Je suis curieux de savoir si cela peut aider. Veuillez nous donner une note si cela a résolu votre problème.

15
Nick Weaver

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

[inputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ;

[outputStream  setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ;

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

Si votre application en mode arrière-plan, la socket voip ne se fermera pas. En utilisant cette prise avec notification uilocal, vous pouvez l'obtenir.

"Si votre application n'est pas un magasin d'applications d'application VoIP d'origine, elle sera rejetée"

5
Gowtham R

Pour quand l'application est au premier plan:

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

Le cadre STOMP dans Obj-C http://code.google.com/p/stompframework/

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

Car lorsque l'application est en arrière-plan, je choisirais probablement d'utiliser APNS (Notifications) pour inviter l'utilisateur à réactiver l'application ...

3
adam