Ich habe mit einem Problem gekämpft, bei dem NSURLConnection
sofort fehlschlägt. Das Gerät muss vollständig neu gestartet werden, oder der Flugmodus muss ein- / ausgeschaltet werden, um das Problem zu beheben. Das Neustarten der App (Streichen nach oben) allein hilft nicht.
Einige Fakten:
-Alle URLs sind HTTPS, TLS 1.2 kompatibel mit Forward Secrecy. Es gibt keine Probleme mit ATS und iOS 9. Der Fehler ist seit iOS 7 aufgetreten und bleibt auf 9.2.
- Von der App werden keine Drittanbieter-Frameworks verwendet. Ich verwende nur native NSURLConnection
-Aufrufe, die immer funktionieren, außer wenn diese ungewöhnliche Situation auftritt.
- Keine Infrastruktur- / Netzwerkprobleme - andere Geräte in denselben Netzwerken (z. B. das gleiche WLAN) arbeiten zur gleichen Zeit in derselben App. Zu / von 3G / Wifi zu gehen macht keinen Unterschied.
-Ich implementiere immer willCacheResponse
, um nil
zurückzugeben.
-Der Dienst wird auf AWS Elastic Beanstalk gehostet, daher wurde von einigen vorgeschlagen, dass es sich bei Änderungen der IP-Adresse um ein DNS-Caching-Problem handeln könnte. Dies erscheint mir unwahrscheinlich und sollte mehrere Fehler gleichzeitig auf verschiedenen Geräten auslösen nie gesehen.
-Die aufgerufene Methode ist didFailWithError
, sofort, als ob auf dem Gerät überhaupt keine Internetverbindung vorhanden wäre - alle anderen Apps funktionieren jedoch.
-Die Website, die die von der App verwendete API hostet, kann jederzeit ohne Probleme durchsucht werden. Die Website stellt die gleichen Anforderungen zum Abrufen von Daten.
Der zurückgegebene Fehlercode ist -1003, kCFURLErrorCannotFindHost
. Ich habe einen Thread auf Git verfolgt, der sich mit dem gleichen Problem beschäftigt, ohne Erfolg. Ссылка
Ich habe versucht, NSURLRequestReloadIgnoringCacheData
für alle meine Anfragen zu verwenden, aber das hat nicht geholfen.
Wer will mit dieser Information raten, was ich vielleicht falsch mache? Ich habe die Bounty hinzugefügt, weil ich keine Ahnung habe, wie ich dieses Problem angehen soll - vor allem, weil es so inkonsequent ist. Und es ist definitiv kein berechtigter Fehler (das heißt, die Domain konnte nicht gefunden werden), da der Service funktioniert, während dies auf zufälligen Clients geschieht.
Ich erstelle meine Anfrage mit einer statischen Methode, die so aussieht. Es wurden einige nicht-öffentliche Informationen entfernt, aber im Grunde führt es nur eine POST-Anfrage mit JSON-Daten aus. [Controller getSQLHost]
gibt nur eine URL zurück - die Basisdomäne.
Delegieren Sie die Verbindung von inputShouldUseCredentialStorage? (oder antworten Sie mit JA)
Ich denke, dass der Schlüsselbund des Geräts verwendet wird, wenn diese Methode yes zurückgibt, was den anhaltenden Fehler über die Lebensdauer der laufenden Anwendung hinaus erklären kann und warum das Neustarten oder anderweitige Zurücksetzen der Netzwerkkonnektivität es "behebt". Wenn ein Authentifizierungsfehler einmal erkannt wurde, kann er für eine kurze Zeit in der Schlüsselkette verweilen, die dann sofort reagieren würde, ohne tatsächlich zum Server zu gehen.
Was dazu führen würde, dass die Authentifizierung als Fehler im Schlüsselbund registriert wird, hängt von verschiedenen Faktoren ab. Es könnte so einfach sein wie ein Tippfehler in dem gespeicherten Passwort oder mehr verschachtelt, wie beispielsweise ein Ablauf des Zertifikats, das verhindert, dass die SSL-Schicht eine sichere Verbindung herstellt.
Sie erstellen NSURLConnection
s auf dem aktuellen Runloop. Wie viele sind gleichzeitig aktiv? Haben Sie darüber nachgedacht, ein NSOperationQueue
zu verwenden, damit Sie nicht von Ladefehlern gebissen werden?
Ist Ihr Delegierter threadsicher? Wenn nicht, könnte das die sporadische Fehlerhaftigkeit erklären.
Sie sagen, Sie sehen das Problem nicht oft, aber andere tun es. Können Sie sich ihre Geräte und vielleicht sogar deren Nutzungsmuster ausleihen und so das Problem öfter sehen?
Tags und Links ios nsurlconnection