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.
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.
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.
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:
manager
qui est désalloué prématurément. (Créer une référence forte)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.
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
}
}
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.
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