NSURLErrorDomain-Fehlercode -999 in iOS

75

Ich habe versucht, die Facebook-API des Corona SDK zu verwenden, um die Punktzahl für das Spiel, das ich entwickle, auf Facebook zu veröffentlichen. Ich habe jedoch ein Problem damit. Beim ersten Versuch, auf Facebook zu posten, wird nach der Anmeldung und Benutzerauthentifizierung folgende Fehlermeldung angezeigt:

NSURLErrorDomain-Fehlercode -999

Dann wird es nicht auf Facebook gepostet. Was sind mögliche Ursachen für diesen Fehler und wie kann ich ihn beheben? Ich habe versucht, im Internet zu suchen, konnte aber keine Informationen darüber finden. Danke im Voraus.

Übrigens verwende ich Webview nicht in meiner App. Nur die Widget-API und ein show_dialog-Listener in meiner Facebook-Klasse.

user1597438
quelle

Antworten:

136

Der Fehler wurde in der Mac Developer Library (iOS-Dokumente) dokumentiert.

Das betroffene Segment aus der Dokumentation ist:

Fehlercodes für das URL-Ladesystem

Diese Werte werden als Fehlercode-Eigenschaft eines NSError-Objekts mit der Domäne "NSURLErrorDomain" zurückgegeben.

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

Wie du siehst; -999wird verursacht durchErrorCancelled . Dies bedeutet: Eine weitere Anfrage wird gestellt, bevor die vorherige Anfrage abgeschlossen ist.

hjpotter92
quelle
4
Kann bedeuten (error.code == NSURLErrorCancelled == -999) und error.domain (NSString) ist NSURLErrorDomain. Sie erhalten dies, wenn Sie eine Aufgabe mit Abbrechen abbrechen
Ryan Heitner
Hallo hjpotter92, meine App stürzt ab, als dieser Fehler aufgetreten ist.
Gopal Devra
11
Wollte hinzufügen, dass Sie den gleichen Fehler (-999) erhalten, wenn das SSL-Zertifikat des Servers Probleme aufweist (dh es ist abgelaufen oder ungültig)
arrteme
1
@ hjpotter92 Ich könnte auf diese Antwort verweisen stackoverflow.com/a/40100179/3065769 ; Ich habe in der Konsole einen abgebrochenen Fehler von -999 erhalten, aber bei der Ausführung derselben POST-Anforderung über Curl wurde die Meldung angezeigt, dass auf dem Server SSL-Probleme aufgetreten sind. Ich habe nicht viel Fachwissen in diesem Bereich
Arrteme
4
Ich habe gerade -999 und ein ungültiges SSL-Zertifikat. Ich habe das Zertifikat repariert und der -999 ist weg.
Florian Cargoet
11

hjpotter92 ist absolut richtig, ich möchte nur eine Lösung für meinen Fall anbieten. Hoffentlich ist es auch für Sie nützlich. Hier ist meine Situation:

Auf der Anmeldeseite> Anmelden drücken> Popup-Ladedialog> Anmeldedienst aufrufen> Dialog schließen> einen anderen Bildschirm drücken> einen anderen Dienst aufrufen -> Fehler verursachen -999

Um dies zu beheben, habe ich eine Verzögerung zwischen dem Schließen des Dialogfelds und dem Drücken eines neuen Bildschirms eingefügt:

    [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];
            });

Es ist seltsam, dass dieses Problem nur unter iOS 7 auftritt.

thanhbinh84
quelle
1
Ich habe das in 10 nicht gesehen, aber nach dem Upgrade auf 11 sehe ich es. Es ist also schwer zu sagen, ob es falsch oder anders ist. Ich habe auch nichts falsch mit dem Verhalten der App gefunden.
Micah Montoya
Weiß jemand, wie man das schnell macht?
Sam
Der von Ihnen präsentierte Code hat nichts mit NSURLSession oder dem vom OP beschriebenen Fehler zu tun. Fehlercodes sind nicht eindeutig - sie sind nur innerhalb ihrer Domäne (NSURLDomain) eindeutig. Wie kann ein UI-Trick dazu führen, dass eine NSURLSession-Task fehlschlägt?
Motti Shneor
8

Ich wollte hier nur hinzufügen, wenn -999 "cancelled"das Problem normalerweise eines von zwei Dingen ist:

  • Sie führen genau dieselbe Anforderung erneut aus.
  • Sie behalten einen schwachen Verweis auf Ihr managerObjekt bei, der vorzeitig freigegeben wird. (Starke Referenz erstellen)
Ramon
quelle
Also, was ist los mit genau der gleichen Anfrage? Ich möchte nur die Seite aktualisieren.
Kimi Chiu
2
Ich sollte näher darauf eingehen, ich meinte, genau dieselbe Anforderung auszuführen, während dasselbe Objekt bereits "ausgeführt" wird (= z. B. Daten herunterladen). Die erste Anforderung wird dann abgebrochen, um die zweite auszuführen.
Ramon
Wenn ich also eine POSTMethode verwende, um genau dieselbe JSONZeichenfolge an dieselbe Adresse zu senden , wird sie abgebrochen? In meinem Fall wird es einfach abgebrochen, selbst wenn die vorherige Anforderung abgeschlossen ist.
Kimi Chiu
@ Chris Graf: Ich habe Ihre Bearbeitung rückgängig gemacht, da ich die Einfachheit dieser Antwort beibehalten möchte. Ich stimme Ihrer Eingabe jedoch zu. Bitte posten Sie Ihren Kommentar wirklich als separate Antwort, damit andere ihn sehen können! :)
Ramon
@Ramon keine Sorge, ich habe die dritte Option in einer separaten Antwort hinzugefügt , danke für das Update!
Chris Graf
4

Ich habe den gleichen Fehler mit Alamofire gesehen und es lag daran, dass das Zertifikat fixiert wurde. Das Zertifikat war nicht mehr gültig, daher musste ich es entfernen und das neue hinzufügen. Ich hoffe es hilft.

Pablo Blanco
quelle
1

Ich habe nicht Corona SDK Facebook - API verwenden , aber ich dieses Problem auftreten , wenn Alamofire verwenden, die secondRequestkündigen immer in der Ausführung mit dem Fehler -999, nach den Pfosten ich im Internet gefunden wird , ist der Grund , dass sessionEigenschaft ist deinitvor dem Abschluss der Asynchron - Arbeit seit Es liegt außerhalb des Bereichs. Ich habe dieses Problem schließlich deinitmanuell durch die Sitzungseigenschaft gelöst, damit der Compiler es nicht an der falschen Position deinitiert:

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
    }

    }
ilovecomputer
quelle
der compiler deinit nichts, deinit wird zur laufzeit gemacht
javier rivarola
1

Die App unseres Unternehmens weist unter iOS viele Fehler von -999 auf. Ich habe mich umgesehen und festgestellt, dass der Grund zwei hat, z. B. dass die Netzwerkaufgabe freigegeben wurde oder das Zertifikat nicht gültig ist. Aber ich habe unseren Code überprüft, diese beiden sind nicht möglich. Ich verwende Alamofire, das URLSession verwendet. Glücklicherweise ist das Netzwerk der Android-App unseres Unternehmens normal. Also prüfen wir den Unterschied. Wir haben festgestellt, dass die http-Anfrage von iOS Http2.0 ist, während Android Http1.1 ist. Also erzwingen wir die http-Support-Version des Backends auf http1.1, dann sinkt die Anzahl der -999-Fehler !!!

Ich denke, es gibt vielleicht einen Fehler in Apples URLSession. Überprüfen Sie den Link Neue NSURLSession für jeden DataTask-Overkill? für einige detaillierte Gedanken

Dan Lee
quelle
1

Zusätzlich zu dem, was Ramon geschrieben hat, gibt es einen dritten möglichen Grund, wenn er Folgendes erhält NSURLErrorDomain -999 cancelled:

Sie haben die Aufgabe während der Ausführung abgebrochen, indem Sie entweder .cancel()das Datenaufgabenobjekt aufgerufen haben oder weil Sie sie .invalidateAndCancel()für das Sitzungsobjekt verwendet haben. Wenn Sie eine benutzerdefinierte Sitzung mit einem Delegaten erstellen, sollten Sie die starke Referenz zwischen der Sitzung und ihrem Delegaten aufrufen .invalidateAndCancel()oder .finishTasksAndInvalidate()auflösen, wie in der Apple Developer-Dokumentation erwähnt :

Das Sitzungsobjekt behält einen starken Verweis auf den Delegaten bei, bis Ihre App die Sitzung beendet oder explizit ungültig macht. Wenn Sie die Sitzung nicht ungültig machen, verliert Ihre App Speicher, bis sie beendet wird.

Wenn Sie sich über dieses Protokollierungsverhalten wundern, habe ich in den Apple Developer-Foren die folgende Erklärung gefunden :

Zur Erklärung haben wir bereits in iOS 10 eine neue systemweite Protokollierungsarchitektur für die Protokollierung eingeführt ( Einzelheiten finden Sie in WWDC 2016, Sitzung 721, Unified Logging und Activity Tracing ). Viele Subsysteme, einschließlich CFNetwork, werden derzeit umgestellt Das. Bis dieser Schritt vollständig abgeschlossen ist, werden Sie auf einige seltsame Randfälle wie diesen stoßen.

Chris Graf
quelle
0

Ich habe diesen Fehler in der iOS-spezifischen Version der Xamarin-App erhalten. Ich bin mir nicht sicher, welche Ursache zugrunde liegt, aber in meinem Fall konnte ich sie mithilfe der Post-Methode umgehen, anstatt nach etwas zu suchen, das den Serverkontext im Anfragetext übergibt - was ohnehin sinnvoller ist. Android / Windows / der Dienst verarbeiten alle das GET mit Inhalten, aber in der iOS-App reagiert es teilweise nicht mehr und spuckt dann das 999 NSUrlErrorDomain-Material im Protokoll aus. Hoffentlich hilft das jemand anderem dabei. Ich gehe davon aus, dass der Netzcode in einer Schleife steckt, aber den fraglichen Code nicht sehen konnte.

Victor Thomas Wilcox Jr.
quelle
0

Bei meinem Cordova-Projekt (oder ähnlichem) stellte sich heraus, dass es sich um ein Plugin-Problem handelte . Stellen Sie sicher, dass Sie keine Plugins verpassen und dass diese ohne Probleme ordnungsgemäß installiert sind.

Die einfachste Möglichkeit, dies zu überprüfen, besteht darin, das Cordova-Projekt ( cordova create <path>) zusammen mit den erforderlichen Plattformen ( cordova platform add <platform name>) neu zu erstellen und jedes Plugin mit dem ausführlichen Flag (--verbose) hinzuzufügen, damit Sie sehen können, ob im Konsolenprotokoll ein Fehler aufgetreten ist Während das Plugin heruntergeladen, zum Projekt hinzugefügt und für jede Plattform installiert wird ( cordova plugin add cordova-plugin-device --verbose)

Rekapitulieren: cordova create <path> cordova platform add <platform name> cordova plugin add cordova-plugin-device --verbose

Vyrnach
quelle
0

Bitte überprüfen Sie bei Ihrem Anruf cancel()auf , URLSessionDataTaskum fix

NSURLErrorDomain Code=-999 "cancelled"
yoAlex5
quelle