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?
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.
Pour moi, il s’agissait de vérifier toutes les bases:
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):
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.<intent-filters>
qui contiennent vos balises <data>
ont l'attribut Android:autoVerify="true"
.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\"}]
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
}
}
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:
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
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:
EF BB BF
, c'est le problème.Voici l'URL que vous pouvez utiliser pour vérifier votre fichier (remplacez example.com par votre URL actuelle):
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.
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
.