2017-09-03 3 views
0

Je fais le téléchargement par lots et en utilisant NSURLSession pour le faire en arrière-plan. Jusqu'à iOS9 tout allait bien, mais iOS10 a un comportement différent:Comment désactiver plusieurs demandes par socket dans NSURLSession?

Si je file d'attente 100 demandes POST, il lot tous à une même prise.

Donc, toutes les 100 demandes se produisent en parallèle sur le même socket, et les délais d'attente après quelques minutes. Sur le côté serveur, nous utilisons AWS ELB, et je suppose que je pourrais désactiver ce comportement à partir des en-têtes des requêtes/paramètres ELB. Le serveur lui-même est node.js. Suggestions?

Edit:

Http header Connection: keep-alive pourrait l'être. Mais je ne peux pas le changer, je vois qu'il est passé de close à keep-alive en utilisant le proxy Charles.

Répondre

0

Finalement, nous avons résolu ce problème en utilisant l'en-tête http Connection.

iOS utilise son option Keep-Alive, ce qui signifie que vous pouvez envoyer plusieurs demandes sur le même socket. La désactivation de la redirection de pipeline et la définition de la valeur de l'en-tête ne permettent pas de le supprimer. iOS le force. Donc, nous avons fini par le retirer de la réponse du serveur. Cela a forcé iOS à ouvrir une nouvelle socket par requête.

De cette façon, il nous est revenu à un certain nombre de connexion correspondant au numéro NSURLSession « s. Nous permettant de télécharger un tas de gros fichiers en arrière-plan sur iOS 10 & 11 bêta.

0

En théorie? Soit:

  • Utilisez plusieurs sessions. NSURLSession ne partage pas les connexions entre les limites de session.
  • Utilisez une file d'attente externe (par exemple, NSOperationQueue) pour limiter le nombre de requêtes simultanées que vous ajoutez à une seule session.

Pour les téléchargements d'arrière-plan, la seule option est probablement la première. Notez que vous devez envoyer chaque requête à une session distincte, car vous aurez beaucoup de frais inutiles de la négociation TLS, etc. Il suffit de garder le nombre de demandes par session à quelque chose de sain.

Cependant, je doute que l'une de ces approches vous aidera. Qu'il s'agisse d'une socket ou de dix, le problème que vous rencontrez est que le réseau cellulaire n'est pas capable de maintenir une connexion ouverte de manière fiable ou que les serveurs/routeurs d'Amazon ne sont pas prêts à le faire. Par conséquent, la solution réelle implique presque certainement une bonne logique de réessai.

Mais je suis un peu confus quand vous dites "en parallèle sur le même socket". Ce n'est pas possible à moins que le pipelining HTTP ne soit activé, ce qui n'est PAS le cas par défaut, même dans iOS 10. Assurez-vous que vous ne l'avez pas activé par erreur.

+0

Merci! Il semble que cela arrive même si je m'assure que le pipelining est éteint. En outre, il semble que iOS bug interne, car il ne se passait pas sur iOS9. Finalement, nous avons compris que nous pouvions contourner le problème en ne permettant pas http keep-alive.Je vais ajouter une réponse complète – avishic