web-dev-qa-db-fra.com

Les liens d'application ne fonctionnent pas sur Android

Mon application définit les filtres d'intention pour gérer les URL de mon site définies par

<intent-filter Android:autoVerify="true">
  <action Android:name="Android.intent.action.VIEW"/>
  <category Android:name="Android.intent.category.DEFAULT"/>
  <category Android:name="Android.intent.category.BROWSABLE"/>
  <data Android:Host="www.Host.com" Android:scheme="http"/>
</intent-filter>
<intent-filter Android:autoVerify="true">
  <action Android:name="Android.intent.action.VIEW"/>
  <category Android:name="Android.intent.category.DEFAULT"/>
  <category Android:name="Android.intent.category.BROWSABLE"/>
  <data Android:Host="www.Host.com" Android:scheme="https"/>
</intent-filter>

L'application détecte correctement les URL du bon hôte, mais demande à l'utilisateur s'il souhaite les ouvrir dans l'application ou le navigateur. J'ai essayé d'utiliser la vérification des liens de l'application telle que spécifiée ici. https://developer.Android.com/training/app-links/index.html

Comme indiqué dans les journaux de mon serveur, une fois installé, le périphérique de l'application interroge /well-known/assetlinks.json et répond avec un statut 200. Test du fichier d’actifs numériques à l’aide du 

https: // digitalassetlinks.googleapis.com/v1/statements:list?source.web.site= https: // <domaine1>: <port> & relation = delegate_permission/common.handle_all_urls

API et il n'a trouvé aucune erreur.

Le SHA256 du fichier assetlinks.json a été obtenu à l’aide de

keytool -list -v -keystore my-release-key.keystore 

le même .keystore dont l'application a été signée.

L'exécution de adb Shell dumpsys package d indique que l'état de vérification du lien est "ask", ce qui signifie que la vérification a échoué. Pourquoi la vérification peut-elle échouer?

30
mohamed.ahmed

Pour nous, c’était des fins de ligne Windows!

Tester avec " https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://domain1:port&relation=delegate_permission/common.handle_all_urls " s'est avéré inestimable car il nous a donné Erreur "Impossible d'analyser la liste d'instructions (JSON non valide)" qui nous a amenés au problème.

CONSEIL: Il était judicieux d'utiliser le bouton "Enregistrer le fichier" dans l'assistant de liaison d'Android Studio App au lieu de copier-coller comme nous l'avons fait. De cette manière, le fichier est généré et le problème ne sera pas résolu.

11
Marchy

Pour moi, il s’agissait de vérifier toutes les bases:

  1. Vérifiez que mon fichier assetLinks est bon avec cet outil: (remplacez domain1: port par votre domaine) https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https:// domain1: port & relation = delegate_permission/common.handle_all_urls
  2. Toujours tester avec un APK signé
  3. Assurez-vous que le périphérique de test fonctionne sous Android 6.0 ou version ultérieure (c'est celui qui m'a mordu parce que je l'ai oublié. Sur les anciennes versions d'Android, vous obtenez toujours l'invite de l'utilisateur)
8
Keith

Il y a quelques pièges courants que vous devriez vérifier deux fois (je ne dis pas que vous l'avez mal fait. C'est juste une liste de contrôle):

  1. Vérifiez que le assetlinks.json est valide et qu'il est accessible depuis https://example.com/.well-known/assetlinks.json. Pour ce faire, vous devez visiter https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site= https://example.com&relation=delegate_permission/common.handle_all_urls. Il ne doit y avoir aucune erreur.
  2. Si vous liez plusieurs domaines à la fois, vérifiez que tous les domaines sont configurés correctement, comme à l'étape 1.
  3. Assurez-vous que les <intent-filters> qui contiennent vos balises <data> ont l'attribut Android:autoVerify="true".
  4. Vérifiez que vous avez la balise <meta-data> requise dans votre balise <application>:

    <meta-data
        Android:name="asset_statements"
        Android:resource="@string/asset_statements"/>
    

    Le contenu de la chaîne asset_statements doit être:

    <string name="asset_statements" translatable="false">[{\"include\": \"https://example.com/.well-known/assetlinks.json\"}]
    
  5. Utilisez également pour le débogage le certificat de signature de version (ne vous inquiétez pas, vous ne pouvez pas le télécharger accidentellement), utilisez-le dans votre build.gradle:

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
        debug {
            debuggable true
            signingConfig signingConfigs.release
        }
    }
    
3
rekire

Mettre à jour

Alors j'ai résolu mon problème. Je ne sais pas qui l’a fait (peut-être une combinaison), mais c’est ce que j’ai fait:

  • "Services Google Play pour les applications instantanées" désinstallés: j'avais déjà bricolé avec les applications instantanées. Je pensais donc que certaines anciennes configurations pourraient rester comme le nom du package de débogage, mais cela est peu probable.
  • Arrêt de l'utilisation de proxies: les proxies sont utiles pour le débogage des appels réseau, mais HTTP/2 peut ne pas être totalement pris en charge sur les outils que j'utilise.
  • Supprimer le filtre d'intention pour les sous-domaines hérités: C'est le gros. Un de mes sous-domaines est obsolète et n'est plus disponible. Dans le manifeste Android, si plusieurs noms d'hôte sont déclarés pour une activité contenant le filtre d'intention au moins un autoVerify, chaque fichier est vérifié pour le fichier JSON de l'actif numérique. Si autoVerify échoue même pour un des hôtes, aucun des hôtes n'est auto-vérifié.

Original

Lorsque j'ai rencontré ce problème pour la première fois, c'était parce que mon réseau bloquait les appels aux serveurs de Google pour vérifier les liens des applications.

Comme OP et d’autres réponses ont abordé, en général, l’appel d’API au noeud final:

digitalassetlinks.googleapis.com

doit réussir à contourner le dialogue du sélecteur. Il s’agit de l’appel Web du système Android, destiné à vérifier le fichier JSON de Digital Asset Link, et semble être effectué lors de l’installation/mise à jour de l’application. Logcat est un endroit utile pour rechercher des éléments avec le texte "I/SingleHostAsyncVerifier:". Si vous voyez "-> true" à la fin du journal, votre application 

Dernièrement cependant, ces appels ont échoué pour moi en raison de ce qui semble être un bogue qui a peut-être été introduit récemment. L'appareil reçoit cette réponse de l'appel API ci-dessus:

Erreur: non disponible: type de contenu incorrect dans les en-têtes de réponse HTTP lors de l'extraction des instructions de {Host} /. Well-connus/assetlinks.json (ce qui équivaut à '{Host} /. Well-connus/assetlinks.json'): attendu ' Content-Type: application/json 'mais a trouvé text/html [11] lors de l'extraction des instructions Web à partir de {Host} ./. Well-known/assetlinks.json

Cela fait longtemps que je n'ai pas examiné ces demandes, donc je ne me rappelle pas à quoi elles ressemblaient auparavant. Mais il semble possible qu'il y ait eu une mise à jour récente impliquant App Links ou le framework de réseau Android, où ils sont passés aux tampons de protocole pour cette fonctionnalité (et ont oublié de la prendre en charge dans une autre). 

Une autre indication du fait que les choses ont peut-être changé est que le chemin de requête apparaît aujourd'hui différent de ceux mentionnés dans les réponses précédentes:

https://digitalassetlinks.googleapis.com/google.digitalassetlinks.v1.AssetLinks/Check

2
user3829751

Pour moi, c’était le fait que mon fichier assetlinks.json était au format UTF-8 et contenait un byte-order mark (BOM), un nombre magique à trois octets en tête du fichier qui signalait l’encodage à un programme consommateur. La nomenclature est facultative et apparemment, les outils Google/Android n’aiment pas la voir. Lorsqu’il était présent, le vérificateur de liens d’actif numérique de Google (URL ci-dessous) m’a renvoyé une erreur «JSON mal formé».

Si vous utilisez Visual Studio, voici comment déterminer si vous avez la nomenclature dans votre fichier et supprimez-la si nécessaire:

  1. Cliquez avec le bouton droit sur votre fichier assetlinks.json.
  2. Choisissez "Ouvrir avec ..." dans le menu contextuel.
  3. Choisissez "Éditeur binaire" dans la boîte de dialogue "Ouvrir avec".
  4. Examinez les octets du fichier. Si le fichier commence par EF BB BF, c'est le problème.
  5. Supprimez ces caractères (vous pouvez le faire via l'une des colonnes) et enregistrez le fichier.
  6. Chargez à nouveau le fichier et testez-le à l'aide des outils Google (URL ci-dessous). Il fonctionnera correctement.

Voici l'URL que vous pouvez utiliser pour vérifier votre fichier (remplacez example.com par votre URL actuelle):

https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://example.com&relation=delegate_permission/common.handle_all_urls

1
Brian Rak

Fenêtre de sélection d'applications système dans deux cas

1) L’utilisateur modifie les liens d’ouverture associés aux paramètres en accédant à Paramètres> applications> icône représentant une roue dentée> liens d’ouverture> sélectionnez une application> ouvrir les liens pris en charge> choisissez Demander à chaque fois.

2) L'application par défaut n'est pas définie par l'utilisateur et la vérification automatique n'est pas activée dans l'un des liens d'application pris en charge.

Je pense que dans votre cas, la vérification automatique est activée, veuillez donc vérifier les paramètres de l'utilisateur.

0
Arnav Rao

Dans mon cas, adb Shell dumpsys package d a révélé que la packageName avait été configurée de manière incorrecte dans assetlinks.json. J'avais utilisé l'attribut package de ma balise manifest dans AndroidManifest.xml, mais j'aurais dû utiliser la valeur Android.defaultConfig.packageId dans mon fichier build.gradle.

0
asciimo