Eine Live-Liste der Requests Ihrer App, gruppiert nach dem Screen, der beim Start angezeigt wurde. Suche und Filter nach Statusklasse und Methode.
Beobachten statt abfangen
Ihr Request bleibt Ihr Request.
Viele In-App-Debugger nehmen Ihren Request, stoppen ihn, bevor er rausgeht, senden eine Kopie aus ihrer eigenen Session, um die Antwort zu holen, und geben diese Antwort dann an Ihre App zurück. DiagnosticSDK hört stattdessen Ihrer Session zu.
Klassischer Interceptor
Ihre URLSession
Ihre AppInterceptorSeine eigene URLSessionServer
1Stoppt Ihren Request, bevor er rausgeht
2Sendet eine Kopie aus seiner eigenen URLSession
3Gibt die Antwort an Ihre App zurück
Ihre URLSessionConfiguration: Header, Timeouts, Cookies, Cache, Proxy
Ihr Delegate mit SSL-Pinning, mTLS-Zertifikaten und Authentifizierungs-Challenges
Braucht Ihr Backend diese Konfiguration (mTLS-Zertifikat, Pinning, Proxy, Session-Header), funktioniert Ihre App mit einem solchen Debugger nicht mehr. Erst wenn Sie dem Debugger diese Konfiguration übergeben, damit er sie in seiner eigenen URLSession nachbaut, läuft sie wieder.
DiagnosticSDK
Ihre App
Ihre URLSession
GET
DiagnosticSDK
Server
Ihre Konfiguration wird unverändert verwendet
Ihr Delegate läuft: SSL-Pinning, mTLS, Authentifizierungs-Challenges
Kein Proxy, kein Zertifikat zu installieren
Der Request ist der, den Ihre App sendet: Er funktioniert überall, wo Ihre App funktioniert.
So funktioniert es
Ein Request, drei Momente.
Folgen Sie einem Request. In jedem Moment liest das SDK etwas mehr davon. Den Request verändert es nie.
1 · Start
Ihr Code ruft resume() auf
Das SDK notiert die Startzeit und den angezeigten Screen.
Request
GET /v1/accounts
Screen
HomeViewController
Start
10:32:04.412
2 · Unterwegs
iOS sendet den Request wie gewohnt
Jeder Aufruf erreicht zuerst Ihren Delegate, unverändert. Danach liest das SDK Status und Antwort.
Request
GET /v1/accounts
Status
200
Antwort
{ "accounts": [ … ] }
3 · Fertig
Der Request erscheint in Live
iOS liefert seine eigenen Zeitmessungen. Der Request erscheint vollständig unter seinem Screen.
Request
GET /v1/accounts
Netzwerk
124 ms
App
151 ms · h2
Was genau so bleibt, wie es war
Der Request geht einmal raus, aus Ihrer eigenen Session.
Ihr Delegate erhält jeden Aufruf, unverändert.
Pinning, mTLS, Cookies, Cache und Timeouts funktionieren weiter.
Die Zeiten sind die des echten Requests.
Von iOS gemessene Zeiten
Wo sind die 124 ms geblieben?
Live misst den Request nicht von außen. Es liest die Messungen, die iOS während des Austauschs vornimmt (URLSessionTaskMetrics), und teilt sie in Schritte auf.
Netzwerkvon iOS gemessen
124 ms
Von Ihrer App gefühltvon resume() bis zu Ihrem Code
151 ms
Die schraffierten 27 ms: Der Request wartete vor dem Start, oder die Antwort wartete, bevor sie Ihren Code erreichte, zum Beispiel in einer ausgelasteten Queue.
DNS-Auflösung9 msDie Serveradresse finden. Lang? Langsames DNS oder erster Aufruf dieser Domain.
Verbindung18 msDie Verbindung öffnen. Entfällt, wenn eine Verbindung wiederverwendet wird.
TLS-Handshake27 msDie Verschlüsselung aufbauen. Bei jedem Request? Verbindungen werden nicht wiederverwendet.
Senden2 msRequest und Body verlassen das Telefon. Lang? Großer Upload oder langsames Netz.
Warten auf den Server56 msIhr Backend bereitet die Antwort vor (Time to First Byte). Lang? Schauen Sie auf den Server.
Download12 msDie Antwort kommt an. Lang? Schwere Antwort oder langsames Netz.
Protokoll
h2
Verbindung wiederverwendet
Nein
Aus dem Cache
Nein
Weiterleitungen
0
Empfangen
18 kB
Liefert iOS keine Messungen, sagt Live das (Quelle: Clock) und zeigt nur die von Ihrer App gefühlte Dauer.
Beispielwerte.
Zuordnung zu Screens
Jeder Request unter seinem Screen.
Live ordnet jeden Request dem Screen zu, der bei seinem Start angezeigt wurde: Sie lesen den Traffic in der Reihenfolge der Navigation.
Suche nach URL, Filter nach Statusklasse und Methode.
/v1/acc
All2xx3xx4xx5xx—
Lesbares JSON
Bodies werden eingerückt und farbig angezeigt, bereit zum Kopieren.
{
"error": "LIMIT_EXCEEDED",
"limit": 1000
}
Dekodierte Tokens
Ein JWT in einem Header oder Body? Live zeigt, was er enthält.
eyJhbGciOi….eyJzdWIiOiI0Mi….SflKxw…
sub 42 · exp 10:47
Was Live nicht sieht
Die Grenzen, klar gesagt.
WKWebView
Seiten in einer WKWebView laden im eigenen Prozess von WebKit, außerhalb Ihrer App. Ihre Requests, auch fetch- und XHR-Aufrufe der Seite, laufen nie über Ihre URLSession, daher sieht Live sie nicht.
Requests, die Ihre App selbst mit URLSession rund um die Web View sendet, werden erfasst.
Außerhalb von URLSession
Live sieht HTTP- und HTTPS-Requests, die mit URLSession gesendet werden. WebSockets, Network.framework-Verbindungen, rohe Sockets und Bibliotheken mit eigenem Netzwerk-Stack werden nicht erfasst.
Bibliotheken, die auf URLSession aufbauen, werden wie alles andere erfasst.
Bodies ohne JSON
Ein Body wird nur gespeichert, wenn sein Content-Type application/json oder +json enthält. Andere Bodies (HTML, Bilder, Formulardaten, Text oder JSON ohne diesen Header) werden nicht gespeichert: Eine kurze Notiz mit ihrem Typ steht an ihrer Stelle. Nur JSON-Antworten können abgespielt werden.
URL, Methode, Header, Status, Größe und Zeiten werden weiterhin erfasst.