85 votes

Code d'erreur NSURLErrorDomain -999 dans iOS

J'ai essayé d'utiliser l'API Facebook de Corona SDK pour afficher le score du jeu que je développe sur Facebook. Cependant, j'ai un problème. La première fois que j'essaie de poster sur Facebook, j'obtiens cette erreur après la connexion et l'authentification de l'utilisateur :

Code d'erreur NSURLErrorDomain -999

Ensuite, il ne s'affiche pas sur Facebook. Quelles sont les causes possibles de cette erreur et comment puis-je y remédier ? J'ai essayé de faire des recherches sur le web mais je n'ai pas trouvé d'informations à ce sujet. Merci d'avance.

D'ailleurs, je n'utilise pas de webview dans mon application. Je n'utilise que l'api widget et un show_dialog listener dans ma classe Facebook.

145voto

hjpotter92 Points 24797

L'erreur a été documentée sur le site Bibliothèque des développeurs Mac (docs iOS)

Le segment concerné de la documentation sera le suivant :

Codes d'erreur du système de chargement des URL

Ces valeurs sont renvoyées en tant que propriété du code d'erreur d'une NSError avec le domaine "NSURLErrorDomain".

enum
{
   NSURLErrorUnknown = -1,
   NSURLErrorCancelled = -999,
   NSURLErrorBadURL = -1000,
   NSURLErrorTimedOut = -1001,

Comme vous pouvez le constater ; -999 est causée par ErrorCancelled . Cela signifie que : une autre demande est faite avant que la demande précédente ne soit terminée.

12voto

Ramon Points 903

Je voulais juste ajouter que lorsque l'on reçoit un -999 "cancelled" le problème est généralement l'un des deux suivants :

  • Vous exécutez à nouveau exactement la même demande.
  • Vous maintenez une référence faible à votre manager qui est désalloué prématurément. (Créer une référence forte)

11voto

doraemon Points 4099

Hjpotter92 a tout à fait raison, je veux juste apporter une solution à mon cas. J'espère qu'elle vous sera utile également. Voici ma situation :

Sur la page de connexion > appuyer sur connexion > faire apparaître une boîte de dialogue de chargement > appeler le service de connexion > fermer la boîte de dialogue > appuyer sur un autre écran > appeler un autre service --> provoquer l'erreur -999

Pour y remédier, j'ai mis un délai entre la fin du dialogue et l'affichage d'un nouvel écran :

    [indicatorAlert dismissWithClickedButtonIndex:0 animated:YES];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.01 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
                [self performSegueWithIdentifier:@"HomeSegue" sender:nil];
            });

Il est étrange que ce problème ne se produise que sous iOS 7.

5voto

Pablo Blanco Points 46

J'ai rencontré la même erreur avec Alamofire et c'était à cause de l'épinglage du certificat. Le certificat n'était plus valide, j'ai donc dû le supprimer et ajouter le nouveau. J'espère que cela vous aidera.

2voto

luiyezheng Points 1867

Je n'ai pas utilisé l'API Facebook de Corona SDK mais j'ai rencontré ce problème en utilisant Alamofire, l'API Facebook de secondRequest annule toujours l'exécution avec l'erreur -999, d'après les messages que j'ai trouvés sur internet, la raison en est que session est deinit avant l'achèvement du travail asynchrone puisqu'il est hors du champ d'application, j'ai finalement résolu ce problème par deinit la propriété de session manuellement afin que le compilateur ne la désinitialise pas à une mauvaise position :

class SessionManager {
    var session:SessionManager?

    init() {
        self.session = SessionManager(configuration:URLSessionConfiguration.ephemeral)
    }
    private func firstRequest() {
        guard let session = self.session else {return}
        session.request(request_url).responseData {response in
            if let data=response.data {
                self.secondRequest()
            }
    }
    private func secondRequest() {
        guard let session = self.session else {return}
        session.request(request_url).responseData {response in
            if let data=response.data {
                self.secondRequest()
            }
            //session will no longer be needed, deinit it
            self.session = nil
    }

    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X