2016-08-31 4 views
2

J'ai une application qui permet à l'utilisateur d'envoyer des messages avec des images. Un utilisateur peut cliquer sur Envoyer, puis fermer immédiatement son téléphone ou passer à une autre application.iOS Mise en réseau - Connexions HTTP et exécution en arrière-plan

Nous étions confrontés à un problème: en cas de connexion temporaire incorrecte, le message ne pouvait pas être envoyé. Nous sommes passés à l'utilisation NSURLSession backgroundConfigurationWithIdentifier de sorte que l'arrière-plan de l'application ne temporise pas immédiatement la demande en cours d'exécution. Nous sommes passés à l'utilisation de ceci pour toutes nos demandes d'API, pensant que cela ne ferait pas de mal à chaque demande de pouvoir continuer en arrière-plan si l'application était fermée au mauvais moment.

Avance rapide de quelques semaines, nous remarquons que toutes les demandes semblent lentes. Utilisant wireshark je viens de découvrir que cette session d'arrière-plan semble utiliser une nouvelle connexion http par requête, ce qui signifie qu'il faut configurer une connexion TCP et un nouveau handshake TLS pour chaque requête, ce qui ajoute une latence de ~ 500ms à chaque requête dans notre application. C'est un gros problème, mais je ne trouve pas ce comportement documenté nulle part, y compris le lien ci-dessus ou background transfer considerations d'Apple. Donc, ma question est: ce comportement est-il attendu, ou est-ce que je fais quelque chose de mal quelque part? Existe-t-il un moyen facile avec NSURLSession de faire une requête HTTP qui utilisera une connexion keep-alive existante s'il y en a une, mais qui peut revenir à backgroundConfiguration si l'application est déplacée en arrière-plan? NSURLSession est la méthode recommandée pour réaliser votre cas d'utilisation.

Répondre

0

Avez-vous essayé d'installer backgroundSessionConfig.discretionary = true

iOS Reference

Valeur booléenne qui détermine si les tâches de fond peuvent être prévues à la discrétion du système pour des performances optimales.

Si cela n'aide pas, je recommande de déposer un bug avec iOS.

+0

J'ai essayé 'discretionary = true' et cela ne fonctionne pas non plus. Je ne suis pas sûr mais j'ai lu cette option pour signifier qu'il pourrait retarder l'exécution de la demande si elle est en arrière-plan et iOS est occupé, je ne m'attendrais pas à avoir un effet si l'application est au premier plan. J'ai déposé un bug avec Apple, on verra ce qu'ils disent. – danny