TWA auto-hébergé dans un état de "Soft Fail" - L'interface utilisateur plein écran fonctionne, mais la délégation native échoue

Je tente de faire fonctionner les notifications natives pour un TWA (Trusted Web Activity) de mon site Discourse auto-hébergé et j’ai rencontré un étrange “échec partiel” lors de la vérification des Digital Asset Links.

Voici les symptômes exacts :

  1. L’application se lance et s’exécute en plein écran sans la barre d’URL, ce qui suggère que le lien d’actif fonctionne partiellement.

  2. Cependant, un message toast “Running in Chrome” apparaît à chaque lancement.

  3. Plus important encore, lorsque la PWA demande la permission de notification, elle affiche l’invite de style navigateur, et non la boîte de dialogue native Android. Cela prouve que la délégation de l’API native échoue.

Ce comportement est cohérent sur tous les appareils de test (Android 12 et 13) et avec les APK générés par Bubblewrap et PWABuilder de Microsoft.

Après un débogage approfondi, j’ai confirmé que toute ma configuration côté client et côté serveur public semble parfaite. Le problème semble être un problème subtil côté serveur qui n’affecte que le validateur Android.

Voici ce que j’ai déjà vérifié :

  • Clé de signature et assetlinks.json : L’empreinte SHA-256 de mon android.keystore correspond exactement à 100 % à l’empreinte dans mon fichier /.well-known/assetlinks.json en direct.

  • Réponse du serveur : Mon serveur sert l’URL assetlinks.json avec un statut 200 OK, le bon Content-Type application/json, et aucun en-tête CORS bloquant lorsqu’il est vérifié avec des outils web standard.

  • Configuration de l’application Android : Le AndroidManifest.xml généré est correct et contient le com.google.browserhelper.trusted.DelegationService standard.

  • Paramètres administrateur Discourse : Mes paramètres de sécurité administrateur pour cors origins et Allowed crawler user agents sont tous deux vides.

Compte tenu de ce comportement spécifique d’“échec partiel”, ma question est la suivante :

Existe-t-il une règle Nginx connue, un paramètre de pare-feu, ou un problème subtil de réponse serveur (comme un léger délai ou un en-tête non standard) dans la configuration par défaut de Discourse auto-hébergé qui pourrait amener le validateur Android à accorder une “confiance partielle” (permettant l’interface utilisateur plein écran) mais à refuser le niveau de confiance supérieur requis pour la délégation d’API native ?

Je suis arrivé au bout de ce qui peut être diagnostiqué côté client. Toute information sur la configuration approfondie du serveur serait grandement appréciée.