Développement iOS: Pourquoi je reçois toujours la “Une erreur de connexion s'est produite” sur la 1ère tentative, mais le succès sur la prochaine?
Je suis en utilisant le ASIHTTPRequest lib dans mon application iOS pour faire Reposante demande à mon Rails 3 web app. - Je voir un étrange et quelque peu cohérente erreur la 1ère fois que j'essaie de faire une requête POST à mon application web, mais alors la requête POST fonctionne bien le sur la deuxième tentative. L'erreur exacte est...
Error Domain=ASIHTTPRequestErrorDomain Code=1 "A connection failure occurred" UserInfo=0xb513740 {NSUnderlyingError=0xb5135a0 "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error -1005.)", NSLocalizedDescription=A connection failure occurred}
Et voici mon ASIHTTPRequest code pour faire la demande POST...
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://myrails3app.heroku.com/tournaments/%d/register.json", tid]];
__block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setRequestMethod:@"POST"];
[request addPostValue:username forKey:@"username"];
[request setCompletionBlock:^
{
NSData *responseData = [request responseData];
NSLog(@"Success!");
}];
//Set the code to be called when the request fails
[request setFailedBlock:^
{
NSError *error = [request error];
NSLog(@"Error: %@", [error localizedDescription]);
}];
//Start the request
[request startAsynchronous];
Il est important de mentionner que lorsque des erreurs, il les erreurs très rapidement! Aussi, pour ce que ça vaut, mon Rail 3 application que je suis en train de faire la requête POST est hébergé sur Heroku. Vos pensées?
Merci beaucoup pour votre la sagesse!
- Peut être que l'interface réseau n'est pas actif jusqu'à ce que la première tentative, qui se réveille pour le deuxième essai?
- Je suppose, mais depuis ce qui se passe sur les appareils iOS, ne serait pas à tous les développeurs de l'aide de l'ASIHTTPRequest lib voir ce problème?
- Ouais, bon point.
- Juste quelques idées: ce problème se produit lors de l'exécution de l'application dans l'émulateur ou également lorsque vous essayez sur un appareil? Voyez-vous le même comportement lorsque vous faites un synchrone demande? Si cela se produit uniquement lors de l'utilisation de demandes asynchrones, alors qu'il pourrait être intéressant de voir si l'application qui agit différemment sur un iPhone/iPad1 (processeur simple core) vs un iPad2/Émulateur (plusieurs noyaux).
- Ce problème se produit dans le simulateur et sur l'iPhone et l'iPad. Je vais essayer de l'exécution d'une synchrone demande et d'en faire rapport.
- J'ai essayé cela avec startSynchronous et il a échoué.
- voir un coup sur votre ruby server pour la première tentative? Votre serveur sera de retour un 500 ou quelque chose la première fois?
- Hey Ray, non, je ne suis pas voyant, un hit pour la première tentative. Ce que cela signifie pour vous?
- Hey Ray, les journaux ne montrent aucun signe de la demande, même pas une réponse 500. Vos pensées?
Vous devez vous connecter pour publier un commentaire.
Cette question, j'ai eu beaucoup de mal à comprendre pourquoi. Le problème réside dans ASIHTTPRequest lui-même (iOS), pas les rails code.
Pour faire une longue histoire courte, le problème est spécifique à l'utilisation de la connexion permanente pour chaque demande envoyée par ASIHTTPRequest.
Alors que c'est bon pour les requêtes GET, la plupart du serveur de mise en œuvre ne permettent pas de connexion permanente à être utilisé avec une requête POST.
Je n'ai pas vraiment le temps d'enquêter en profondeur sur le côté serveur de choses, mais je pense que le problème réside avec le 100-continue d'en-tête qui doit être envoyé (et qui n'est pas) avec la demande de qui a du corps attaché à elle (d'où PUT/POST). Si vous voulez avoir un regard plus profond de quoi je parle, allez lire à la feuille de spécifications: http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html
Donc la persistance de la connexion utilisée par ASIHTTPRequest attendre pour un 100 réponse à envoyer, ce qui n'est jamais envoyé. donc, il finit par être dépassé.
Un correctif est de mettre en persistentConnection PAS avec vos requêtes post comme suit:
rails s thin
Sécuriser La Connexion A Échoué
SSL a reçu un nombre record avec un mauvais Code d'Authentification de Message.
(Code d'erreur: ssl_error_bad_mac_read)
La page que vous essayez de vue ne peuvent pas être affichés en raison de l'authenticité des données reçues n'a pas pu être vérifiée.
Merci de contacter les propriétaires de site web pour les informer de ce problème. Vous pouvez également utiliser la commande qui se trouve dans le menu d'aide de faire rapport de ce cassé site.
Sur iOS 5.1, même après la mise à niveau
ASIHTTPRequest
àASIHTTPRequestVersion
= @"v1.8.1-61 2011-09-19" encore nécessaires:j'ai également eu à régler réponse setHeader Connexion à "fermer" en Java servlet