2015-12-28 15 views
8

Ich habe mit einem Problem kämpfen, wo NSURLConnection Anrufe sofort fehlschlagen. 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.NSURLConnection fehlschlägt zufällig bis zum Neustart des Geräts

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 Anrufe, die immer funktionieren, außer wenn diese seltsame Situation auftritt.

- Keine Infrastruktur-/Netzwerkprobleme - andere Geräte in denselben Netzwerken (z. B. dasselbe WLAN) funktionieren gleichzeitig 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 vorgeschlagen, dass es bei Änderungen der IP-Adresse zu einem DNS-Caching-Problem kommen könnte. Dies scheint mir unwahrscheinlich und sollte mehrere Fehler gleichzeitig auf verschiedenen Geräten auslösen habe noch nie gesehen.

-Die Methode heißt didFailWithError, sofort, als gäbe es auf dem Gerät überhaupt keine Internetverbindung - 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. https://github.com/AFNetworking/AFNetworking/issues/967

Ich versuchte mit NSURLRequestReloadIgnoringCacheData für alle meine Anfragen, aber das hat nicht geholfen.

Mit dieser Information wird jemand sich interessieren, um eine Schätzung zu wagen, was ich falsch machen könnte? 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 Dienst 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 durch. [Controller getSQLHost] gibt nur eine URL zurück - die Basisdomäne.

+0

siehe in swift: http://iosdevcenters.blogspot.in/2015/12/nsurlrequest-in-swift.html –

+0

@KiritModi Während ich schätze, dass Sie Zeit nehmen, um zu antworten, sehe ich nicht, was der Artikel zu tun hat mein Problem? – nickdnk

+0

Können Sie mir URL geben? –

Antwort

0

Gibt es eine delegierte Verbindung? ShouldUseCredentialStorage? (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 ein Neustart oder eine anderweitige Zurücksetzung der Netzwerkverbindung diesen Fehler 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 die Authentifizierung als Fehlschlag im Schlüsselbund registrieren könnte, 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 eines Zertifikats, das verhindert, dass die SSL-Schicht eine sichere Verbindung herstellt.

+0

Ich habe diese Methode nicht implementiert, nein. Ich benutze SSKeyChain, um das Geräte-Token jedes Mal vom Keychain abzurufen, wenn die App startet. Dies wird dann Teil der Anfrage. – nickdnk

+0

Was ich von dieser Methode verstehe, ist, dass, wenn Sie es nicht implementieren, der Anrufer annimmt, dass es JA antwortet, und es wird zum SchlüsselChain-Speicher gehen. Wenn Sie Ihre eigenen Schlüsselkettenmanipulationen durchführen, könnte dies stören und Sie möchten vielleicht die Methode implementieren, damit sie mit NEIN antwortet. –

+0

Aber würde das nicht jeden Anruf scheitern lassen? Ich könnte es versuchen, denke ich. – nickdnk

0

Sie erstellen NSURLConnection s auf dem aktuellen Runloop. Wie viele sind gleichzeitig aktiv? Haben Sie überlegt, eine 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, dass Sie das Problem nicht oft sehen, aber andere tun. Können Sie sich ihre Geräte und vielleicht sogar deren Nutzungsmuster ausleihen und so das Problem öfter sehen?

+0

Meistens nur ein Anruf zu einer Zeit. Ich erstelle nicht mehr als eine Anfrage pro Benutzeraktion. Ich kann ihre Geräte nicht ausleihen. - Das Problem tritt nicht häufig genug auf - auch würde ich nicht wissen, was zu tun ist, da die einzige Protokollierung, die ich bekommen kann, Fehler 1003 ist, der mir nichts sagt. Ich überlege, zu NSURLSession zu wechseln, aber nach dem GitHub-Thread, der keinen Unterschied macht. – nickdnk

+0

Ich weiß nichts über Gewindesicherheit. Ich folgte nur den üblichen Anleitungen für NSURLConnection. Keine von ihnen erwähnt Fadensicherheit. – nickdnk

Verwandte Themen