Sie haben einen neuen Build ausgeliefert, sind ins VPN gewechselt, und derselbe Bildschirm lädt nicht mehr. Ab Android 9 ist die häufigere Erklärung langweiliger: Die Plattform verweigert einfaches HTTP für Apps, die auf API 28 oder höher zielen, und das VPN hat nur genug Kontext verändert, um es sichtbar zu machen. Welchen Fehler Sie sehen, hängt vom HTTP-Client ab, deshalb sagt er so selten Cleartext.

Was der Fehler tatsächlich ist

Ab Android 9 blockiert die Plattform Cleartext standardmäßig, sobald eine App auf API-Level 28 oder höher zielt. Die Anfrage an eine einfache HTTP-Adresse wird von der Plattform abgelehnt, bevor ein einziges Paket das Gerät verlässt. Welchen Fehler Sie sehen, hängt von der HTTP-Bibliothek ab: mal ein allgemeiner Netzwerkfehler, mal ein Timeout, mal eine Meldung, die Cleartext ausdrücklich nennt. Was sie nie tut, ist Ihren Server erreichen. Android dokumentiert den Standard und die domänenbezogene Alternative im Leitfaden zur Sicherheitskonfiguration.

Ein Browser auf demselben Gerät kann die Seite weiterhin laden, und das ist der Hinweis, den die meisten übersehen. Browser unterliegen nicht der Netzwerksicherheitsrichtlinie Ihrer App.

Warum das VPN beschuldigt wird

Drei Dinge ändern sich meist gleichzeitig. Die App löst nach dem Verbindungsaufbau zum VPN möglicherweise einen anderen Hostnamen auf, das Gerät kann ein neues mit einem neueren Build sein, oder der Build selbst ist auf ein Ziel-API-Level gewechselt, das den Standard auslöst. Das VPN ist sichtbar und das Ziel-SDK nicht, also bekommt das VPN das Ticket.

Vergleichen Sie die Ziel-Level des alten und des neuen Builds, bevor Sie die Netzwerkkonfiguration anfassen. Eine App, die auf 27 oder niedriger zielt, ist ausgenommen, was jeden Bericht der Art „bei mir läuft es auf dem älteren Telefon“ erklärt.

Wo das Expo-Flag wirklich landet

In einem verwalteten Expo-Projekt bearbeitet das Hinzufügen einer Einstellung zu app.json kein Android-Manifest, weil Prebuild und Development-Builds das Manifest erzeugen. Ein Konfigurations-Plugin ist das, was die Einstellung in dieser Phase schreibt. Der unterstützte Weg ist expo-build-properties, konfiguriert in der App-Konfiguration mit der Cleartext-Option unter android.

{
  "plugins": [
    ["expo-build-properties", {
      "android": { "usesCleartextTraffic": true }
    }]
  ]
}

Das Snippet setzt nur die Plugin-Option; das Manifest entsteht später. Führen Sie einen Prebuild oder einen frischen Development-Client-Build aus und prüfen Sie dann vor dem erneuten Test das erzeugte AndroidManifest.xml auf android:usesCleartextTraffic, denn ein reines JS-Neuladen behält das alte Manifest. Gleichen Sie die Plugin-Version mit dem Expo-SDK ab, auf dem das Projekt läuft. Plugin-Optionen verschieben sich zwischen Releases, und ein aus einem anderen SDK kopiertes Snippet ist eine verlässliche Quelle für stilles Nichts-Tun.

Der Bare-Workflow und die engere Option

Für bare React Native ist das Äquivalent android:usesCleartextTraffic am application-Element oder eine Netzwerksicherheitskonfiguration, die Cleartext nur für benannte Domains erlaubt. Die domänenbezogene Form ist die vorzuziehende, weil sie die interne API erlaubt und alles andere auf HTTPS lässt. Sie dokumentiert außerdem ihre eigene Ausnahmeliste, und genau danach wird ein Reviewer fragen.

Keiner der beiden Ansätze ändert den Standard der Plattform für etwas, das Sie nicht benannt haben.

Beweisen Sie es zuerst aus dem Gerätelog

Bevor Sie die Konfiguration bearbeiten, holen Sie sich den genauen Fehler. adb logcat auf einem angeschlossenen Gerät zeigt die Cleartext-Ablehnung der Plattform und nennt die Komponente, die sie ausgelöst hat. Ein abgelehnter Socket, ein Name, der sich nicht auflösen lässt, oder ein fehlgeschlagener TLS-Handshake deuten auf etwas ganz anderes hin, und Cleartext zu aktivieren würde die App nur grundlos schwächen.

Halten Sie dann die Produktion ehrlich. Cleartext ist für einen Labor-Endpunkt akzeptabel, der kein TLS anbieten kann, und nur für die kürzestmögliche Zeit, die Sie planen können. Kann die API TLS innerhalb des privaten Netzes terminieren, legen Sie das Zertifikat in den Trust Store des Geräts und lassen Cleartext deaktiviert, denn der Tunnel verschlüsselt den Weg bis zu seinem Ausgang und nichts darüber hinaus.

Sobald der Endpunkt über HTTPS antwortet, entfernen Sie die Berechtigung, bauen Sie neu und testen Sie im selben Durchgang über das VPN und über normales WLAN. Die Namensauflösung kann sich zwischen diesen beiden Wegen unterscheiden, und nur das Paar sagt Ihnen, welcher die Wahrheit sagt.

Ähnliche Artikel