web-dev-qa-db-fra.com

AFNetworking - Echec du chargement HTTP (code d'erreur: -999) Swift iOS

J'utilise AFNetworking avec iOS 11. Je reçois des erreurs telles que:

Tâche <2EC9C49F-1889-4BFF-83B4-2047ED6E5F2A>. <1> Le chargement HTTP a échoué (code d'erreur: -999 [1:89]) Error (countries.php): Domaine d'erreur = Code NSURLErrorDomain = -999 "annulé" UserInfo = {NSErrorFailingURLStringKey = https://www.plrc.us/api/countries.php , NSLocalizedDescription = annulé, NSErrorFailingURLKey = https://www.plrc.us/api/countries.php }

J'ai essayé tous les moyens possibles.

 info.plist

S'il vous plaît aidez-moi à résoudre ce problème. 

Je vous remercie

7
Riddhi Shah

Il existe quelques problèmes mineurs non liés:

  1. NSExceptionAllowsInsecureHTTPLoads devrait être un booléen, pas une chaîne. 

  2. Le service Web renvoie JSON, mais conserve son Content-Type en tant que text/html. Mais AFNetworking (et son frère Swifty, Alamofire), valide les en-têtes HTTP Content-Type.

    Si vous utilisez AFNetworking, cela signifie que vous souhaitez probablement ajouter text/html à la liste des types de contenu acceptables pour AFJSONResponseSerializer. (Ou vous pouvez utiliser AFHTTPResponseSerializer, mais vous devez ensuite analyser le JSON vous-même.)

Mais ni l'un ni l'autre ne sont probablement la source de la variable NSURLErrorCancelled. J'ai été en mesure d'interroger ce service Web à partir d'iOS sans obtenir cette erreur "annulée" (à la fois avec vos paramètres Plist et sans aucun paramètre lié au réseau Plist).

Je me demande s'il pourrait y avoir un problème de configuration sur votre ordinateur ou votre réseau. J'essayerais de tester cela sur un périphérique physique plutôt que sur le simulateur. (Cela élimine la configuration de l'ordinateur en tant que source possible du problème.) Si cela fonctionne, essayez de le tester sur une connexion cellulaire plutôt que par wifi. (Cela élimine la configuration de votre réseau local, par exemple une bizarrerie de serveur proxy, en tant que source du problème.)

Dans AFNetworking, la routine de test d'authentification par défaut transmet NSURLSessionAuthChallengeCancelAuthenticationChallenge au gestionnaire d'achèvement de URLSession:didReceiveChallenge:completionHandler: , ce qui donnera NSURLErrorCancelled. Mais la configuration système standard ne déclenchera pas cela. Mais si quelque chose dans votre ordinateur ou votre réseau déclenche ce défi d'authentification dans AFURLSessionManager.

Par exemple, j'ai pu reproduire votre problème lorsque vous utilisez Charles et que vous désactivez le certificat racine Charles, ce qui entraîne ce type d'erreur "annulée". Dans mon exemple particulier, une fois que j'ai configuré mon simulateur pour faire confiance à Charles pour SSL, via "Aide" de Charles »" Proxy SSL "» "Installer le certificat racine de Charles pour les simulateurs iOS"). Je ne dis pas que c’est le problème précis qui se pose dans votre cas (il s’agit uniquement d’utilisateurs de Charles), mais c’est un exemple d’une catégorie plus large de problèmes pouvant déclencher un défi d’authentification, entraînant AFNetworking à annuler le défi, ce qui NSURLErrorCancelled

En bout de ligne, essayez de modifier la configuration avec laquelle vous essayez de vous connecter au serveur distant et voyez si vous pouvez identifier les configurations qui ne manifestent pas le problème et d'autres qui le font.

4
Rob

J'ai rencontré ce problème alors que je développais une preuve de concept et que notre serveur ne disposait pas des certificats appropriés. Il semblait que la plupart des questions liées à cela concernaient l'utilisation d'AFNetworking 1 et 2, et la plupart des réponses ne fonctionnaient pas pour moi avec AFNetworking 3, notamment la modification du .plist.

Ce qui a fonctionné pour moi a été de modifier le AFSecurityPolicy *securityPolicy; comme suit:

AFSecurityPolicy *sec = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
[sec setAllowInvalidCertificates:YES];
[sec setValidatesDomainName:NO];
manager.securityPolicy = sec;

J'ai trouvé cela grâce à Dody Rachmat Wicaksono answer ici.

OP de cette question posté réponse dans Swift.

Remarque: Comme d'autres solutions de contournement similaires à celle-ci, ceci n'est pas destiné à être utilisé dans un environnement de production. 

0
Tyler Kuntz