web-dev-qa-db-fra.com

NSURLErrorDomain error code -999 dans iOS

J'ai essayé d'utiliser l'API Facebook de Corona SDK pour publier le score sur le jeu que je développe sur Facebook. Cependant, j'ai un problème avec ça. Lors de ma première tentative de publication sur Facebook, j'obtiens cette erreur après la connexion et l'authentification de l'utilisateur:

NSURLErrorDomain code d'erreur -999

Ensuite, il ne postera pas sur facebook. Quelles sont les causes possibles de cette erreur et comment puis-je y remédier? J'ai essayé de chercher sur le Web, mais je n'ai pas trouvé d'informations à ce sujet. Merci d'avance.

En passant, je n'utilise pas WebView sur mon application. Juste le widget api et un auditeur de show_dialog dans ma classe Facebook.

63
user1597438

L'erreur a été documentée sur le Bibliothèque de développement Mac (Documents iOS)

Le segment concerné de la documentation sera:

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

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

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

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

125
hjpotter92

hjpotter92 a absolument raison, je veux juste fournir une solution à mon cas. J'espère que cela vous sera utile également. Voici ma situation:

Sur la page de connexion> appuyez sur le bouton de connexion> ouvrez la boîte de dialogue de chargement> appelez le service dans le service> fermer la boîte de dialogue> Afficher un autre écran> appeler un autre service -> provoquer une erreur -999

Pour résoudre ce problème, j'ai mis un délai entre le fait de fermer le dialogue et de pousser 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 se produise uniquement sur iOS 7.

11
thanhbinh84

Je voulais juste ajouter ici, lors de la réception d'un -999 "cancelled" le problème est généralement l'une des deux choses suivantes:

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

En plus de ce que Ramon a écrit, il existe une troisième raison possible pour recevoir un NSURLErrorDomain -999 cancelled:

Vous avez annulé la tâche en cours d'exécution en appelant .cancel() sur l'objet de tâche de données ou parce que vous avez utilisé .invalidateAndCancel() sur l'objet de session. Si vous créez une session personnalisée avec un délégué, vous devez appeler .invalidateAndCancel() ou .finishTasksAndInvalidate() pour résoudre la référence forte entre la session et son délégué, comme indiqué dans le Apple Documentation développeur :

L'objet de session conserve une référence forte au délégué jusqu'à ce que votre application quitte ou invalide explicitement la session. Si vous n'invalidez pas la session, votre application perd de la mémoire jusqu'à ce qu'elle se ferme.

Si vous vous interrogez sur ce comportement de journalisation, j'ai trouvé l'explication suivante dans le forums Apple Developer :

En guise d’explication, dans iOS 10, nous avons introduit une nouvelle architecture de journalisation à l’échelle du système (veille journalisation unifiée et session d’activité WWDC 2016 Session 721 pour les détails) et de nombreux sous-systèmes, y compris CFNetwork, sont: en train de passer à cela. Jusqu'à ce que ce déménagement soit complètement terminé, vous allez rencontrer des cas Edge étranges comme celui-ci.

1
Chris Graf

Je n'ai pas utilisé l'API Facebook de Corona SDK, mais j'ai rencontré ce problème lors de l'utilisation d'Alamofire, le secondRequest s'annule toujours lors de l'exécution avec l'erreur -999, selon les publications trouvées sur Internet, la raison en est que session propriété _ est deinit avant la fin du travail asynchrone car elle est hors de portée, j'ai finalement résolu ce problème en deinit la propriété de session manuellement afin que le compilateur ne le définisse pas au mauvais endroit:

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
    }

    }
1
billphilip22

J'ai rencontré la même erreur avec Alamofire et c'était parce que le certificat était épinglé. Le certificat n'était plus valide, alors j'ai dû le retirer et ajouter le nouveau. J'espère que ça aide.

0
Pablo Blanco

L'application de notre société a beaucoup -999 erreur dans iOS. J'ai cherché autour, trouvé la raison a deux, comme la tâche de réseau a été dealloc ou le certificat n'est pas valide. Mais j'ai vérifié notre code, ces deux ne sont pas possibles. J'utilise Alamofire, qui utilise URLSession. Heureusement, le réseau de notre société Android est normal. Nous vérifions donc la différence. Nous avons trouvé que la demande http d'iOS est Http2.0, alors que Android est Http1. Nous avons donc forcé la version finale du support http à http1.1, puis le nombre d’erreurs -999 décroît !!!

Je pense qu'il y a peut-être un bug dans URLSession d'Apple. Vérifiez le lien Nouvelle NSURLSession pour chaque dépassement de capacité DataTask? pour quelques détails

0
Dan Lee