8
votes

iOS - aléatoire "Impossible de se connecter à l'hôte" avec 3G

Je travaille sur une application iOS qui fonctionne comme un client léger pour un serveur Bussiness. Il y a beaucoup de demandes envoyées au serveur, beaucoup de données téléchargées.

Je n'utilise aucun cadre de demande de fantaisie, juste asynchrones nsurlconnection avec un délégué.

L'application fonctionne généralement très bien avec WiFi et 3G mais

Certains utilisateurs signalent des déconnectes aléatoires lors de l'utilisation de 3G (aux États-Unis). Toutes les demandes sont okey, mais une fois de temps en temps qu'une demande échoue avec "Impossible de se connecter à l'hôte" (-1004) Erreur.

Cela affecte beaucoup l'expérience de l'utilisateur.

Quelques faits:

  1. Cela n'arrive pas sur WiFi
  2. Les utilisateurs signalent que cela ne se produit pas avec d'autres applications lors de l'utilisation de 3G.
  3. Ce n'est pas un problème de délai d'attente, l'erreur apparaît 0,3 à 1,0 seconde après le démarrage de la connexion.
  4. Nous n'avons pas été en mesure de reproduire le problème à l'aide de Traceroute.
  5. en utilisant SCNetworkability L'hôte semble être accessible (je connais les limitations de cette API).

    question quelle pourrait être la cause du problème? Quelles propriétés de connexion peuvent être différentes avec 3G et WiFi? Comment puis-je le déboguer?

    Actuellement, la seule solution que je vois est d'essayer d'envoyer la demande si la demande précédente a échoué. Cependant, je voudrais d'abord trouver la cause du problème.

    edit Le problème a probablement été causé par l'un de nos routeurs. Les gars-là inspectent toujours le problème.


1 commentaires

permet de voir votre code. Je connais que vos tests de l'unité passent et tout sauf au cas;)


3 Réponses :


3
votes

Je reviendrais l'hypothèse que cela n'affecte que votre demande. Il y a beaucoup de façons que les utilisateurs ne peuvent que les voir les problèmes de votre application, même si le problème est avec leur connexion Internet. Par exemple, peut-être que les autres applications réessayent de manière transparente - les utilisateurs verraient simplement des vitesses de mise à jour plus lentes. Ou peut-être que les connexions abandonnées ne comptent tout simplement pas pour les autres applications.

Avez-vous demandé aux utilisateurs concernés du fournisseur qu'ils utilisent? Si tous utilisent le même réseau mobile, cela indiquerait que c'est un problème avec le réseau plutôt que votre application.


0 commentaires

2
votes

Il me semblerait que la raison de cela est simplement basse à la nature des données cellulaires et de l'accès à Internet. Comme vous le savez peut-être, lorsque vous utilisez une connexion cellulaire, parfois - surtout si vous déménagez, la connexion changera de réseau car elle modifie les tours de diffusion.

Vous mentionnez que vous téléchargez de nombreuses données et à intervalles de près, je supposerais que cela rend votre candidature plus sujette à ce problème, et je n'accepterais pas une seconde que cela ne se produirait pas pour d'autres applications. - Il s'agit de timing.


0 commentaires

4
votes

Tous les codes d'erreur peuvent être trouvés dans la documentation Apple sous la section

Codes d'erreur CFNetwork Référence

Le code -1004 est décrit seulement comme

kcfurlerrorcannotconnecttoostHost

La connexion a échoué parce qu'un La connexion ne peut pas être faite à l'hôte. Disponible dans OS X V10.6 et plus tard. Déclaré dans cfnetworkerrors.h.

Cela signifie fondamentalement que l'utilisateur a une connexion (il n'est pas sur FlightMode, le trafic de données est activé et son téléphone est inscrit sur le réseau, vous avez eu une URL valide, etc.), mais a été activement empêchée de connecter au serveur . Si le serveur ne répondait pas, vous auriez eu quelque chose de plus comme une erreur de temps externe après un temps d'attente plus long, comme vous l'avez décrit. Ce type d'erreur est probablement causé par quelque chose empêchant le trafic du serveur et peut par exemple se produire si l'utilisateur est derrière un pare-feu ou un proxy.

La question pourrait effectivement être causée par le fournisseur, surtout si vous n'avez aucune question avec certains utilisateurs et des problèmes aléatoires avec d'autres.

Comme une autre affiche indiquée, vous pouvez essayer de demander à vos utilisateurs de leur fournisseur de services et de plus de détails sur leur emplacement, ou de ce qu'ils faisaient quand ils ont obtenu l'erreur (comme assis dans un véhicule ou une mauvaise réception dans le Campagne)

Si vous ne trouvez pas de motifs, et si l'erreur ne se produise vraiment pas au hasard et uniquement pour certains utilisateurs, et juste parfois, je considérerais simplement que ce serait une autre question inévitablement pouvant être causée par le fait que Les téléphones mobiles ne sont jamais liés à être connectés tout le temps , et que certains fournisseurs de téléphones portables peuvent ne pas toujours livrer 100% de tous les emballages qui doivent être livrés là-bas ... Ce que vous devez faire, il est juste de gérer l'erreur.

construisez l'erreur en réessayant simplement et ne le montrez pas à l'utilisateur, du moins pas avant après une quantité suffisante de tentatives.

Une dernière chose à considérer:

Si vous envoyez des lots et beaucoup de demandes de votre application, ainsi que de nombreuses données, assurez-vous que vous n'êtes pas "surconsommant" en spamming énormes quantités de demandes inachevées. Cela pourrait causer le serveur ou un serveur de proxy sur le point de refuser votre demande car il est trop occupé à répondre à votre autre demande. Une demande refusée pourrait provoquer une erreur comme celle-là. Assurez-vous d'envoyer une quantité raisonnable de demandes afin que le périphérique de votre utilisateur ait le temps de "respirer".

Laissez votre tentative-scheme être un intelligent que vous commencez par réessayer un tas de fois dans un délai plus court, et si cela empêche l'échec, augmentez la durée jusqu'à la nouvelle tentative suivante.


4 commentaires

Bien que cette réponse ne me dise rien de nouveau, c'est probablement la meilleure réponse. Je vais ajouter des tentatives.


Vérification du code de retour d'une demande de réseau suspendue ne réalise rien. Depuis son accroché.


Non seulement cela, mais vous devriez construire un thread, une runloop, un délai d'attente et un décompte de réessayer pour chaque demande de réseau dans votre application pour accomplir ce que vous dites ... pas la bonne solution.


Il n'est pas suspendu car il a échoué avec des erreurs. Lorsque la demande échoue, cela signifie qu'il a abandonné. Si vous souhaitez que les données vous devez envoyer une nouvelle demande. S'il y a toujours une accompagnement accessible, aucune raison de ne pas le refaire. Vous n'avez pas à le faire avec des centaines de threads et un gestionnaire pour chaque demande, si vous vous battez avec de nombreuses demandes, vous pouvez écrire du code pour les centraliser et les gérer au même endroit et vous assurer qu'ils se comportent bien. Je viens de vérifier la portée de la portée, puis de bombarder les demandes, car vous supposez que cela fonctionnera n'est pas une solution très stable.