Android-App-Links prüfen

Ein Android-App-Link ist eine spezielle Art von Deeplink, mit der die entsprechenden Inhalte in Ihrer Android-App sofort über Ihre Website-URLs geöffnet werden können, ohne dass der Nutzer die App auswählen muss. Android-App-Links verwenden die Digital Asset Links API, um zu bestätigen, dass Ihre App von der Website genehmigt wurde, Links für diese Domain automatisch zu öffnen. Wenn das System bestätigt, dass Sie Inhaber der URLs sind, werden diese URL-Intents automatisch an Ihre App weitergeleitet.

So bestätigen Sie, dass Sie Inhaber sowohl Ihrer App als auch der Website-URLs sind:

  1. Fügen Sie Intent-Filter hinzu, die das Attribut autoVerify enthalten. Dieses Attribut signalisiert dem System, dass es prüfen soll, ob Ihre Anwendung zu den URL-Domains gehört, die in Ihren Intent-Filtern verwendet werden.

  2. Deklarieren Sie die Verknüpfung zwischen Ihrer Website und Ihren Intent-Filtern, indem Sie eine Digital Asset Links-JSON-Datei an folgendem Speicherort hosten:

    https://domain.name/.well-known/assetlinks.json

Weitere Informationen finden Sie in den folgenden Ressourcen:

Intent-Filter für die Überprüfung von App-Links hinzufügen

Wenn Sie die Überprüfung der Linkverwaltung für Ihre App aktivieren möchten, fügen Sie Intent-Filter hinzu, die dem folgenden Format entsprechen:

<!-- Make sure you explicitly set android:autoVerify to "true". -->
<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" />

    <!-- If a user clicks on a shared link that uses the "http" scheme, your
         app should be able to delegate that traffic to "https". -->
    <!-- Do not include other schemes. -->
    <data android:scheme="http" />
    <data android:scheme="https" />

    <!-- Include one or more domains that should be verified. -->
    <data android:host="..." />
</intent-filter>

Es reicht aus, autoVerify nur in einer <intent-filter>-Deklaration für jeden Host anzugeben, auch wenn dieser Host in anderen nicht gekennzeichneten Deklarationen verwendet wird. Wir empfehlen jedoch, autoVerify jedem <intent-filter>-Element hinzuzufügen, um für Einheitlichkeit zu sorgen. Dadurch wird auch sichergestellt, dass Ihre Anwendung nach dem Entfernen oder Refaktorieren von Elementen in der Manifestdatei mit allen Domains verknüpft bleibt, die Sie noch definieren.

Für die Domainbestätigung ist eine Internetverbindung erforderlich und der Vorgang kann einige Zeit dauern. Um die Effizienz des Prozesses zu verbessern, prüft das System eine Domain für eine App, die auf Android 12 oder höher ausgerichtet ist, nur dann, wenn sich diese Domain in einem <intent-filter>-Element befindet, das genau das im vorherigen Code-Snippet angegebene Format enthält. Andere Schemas als „http“ und „https“ wie <data android:scheme="custom" /> verhindern beispielsweise, dass ein <intent-filter> die Domainbestätigung auslöst.

App-Verknüpfung für mehrere Hosts unterstützen

Das System muss in der Lage sein, den in den Datenelementen der App-URL-Intent-Filter angegebenen Host mit den Digital Asset Links-Dateien zu vergleichen, die auf den entsprechenden Webdomains in diesem Intent-Filter gehostet werden. Wenn die Überprüfung fehlschlägt, verwendet das System standardmäßig das Standardverhalten, um den Intent aufzulösen, wie unter Deeplinks zu App-Inhalten erstellen beschrieben. Die App kann jedoch weiterhin als Standard-Handler für alle URL-Muster bestätigt werden, die in den anderen Intent-Filtern der App definiert sind.

Hinweis:Unter Android 11 (API-Level 30) und niedriger wird Ihre App vom System nur dann als Standard-Handler überprüft, wenn eine übereinstimmende Digital Asset Links-Datei für alle Hosts gefunden wird, die Sie im Manifest definieren.

Eine App mit den folgenden Intent-Filtern besteht beispielsweise nur die Überprüfung für https://www.example.com, wenn eine assetlinks.json-Datei unter https://www.example.com/.well-known/assetlinks.json, aber nicht unter https://www.example.net/.well-known/assetlinks.json gefunden wird:

<application>

  <activity android:name=”MainActivity”>
    <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:scheme="http" />
      <data android:scheme="https" />
      <data android:host="www.example.com" />
    </intent-filter>
  </activity>
  <activity android:name=”SecondActivity”>
    <intent-filter>
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.BROWSABLE" />
      <data android:scheme="https" />
     <data android:host="www.example.net" />
    </intent-filter>
  </activity>

</application>

Hinweis:Alle <data>-Elemente im selben Intent-Filter werden zusammengeführt, um alle Varianten der kombinierten Attribute zu berücksichtigen. Der erste Intent-Filter oben enthält beispielsweise ein <data>-Element, das nur das HTTPS-Schema deklariert. Es wird aber mit dem anderen <data>-Element kombiniert, damit der Intent-Filter sowohl http://www.example.com als auch https://www.example.com unterstützt. Daher müssen Sie separate Intent-Filter erstellen, wenn Sie bestimmte Kombinationen von URI-Schemas und Domains definieren möchten.

Unterstützung der App-Verknüpfung für mehrere Subdomains

Das Digital Asset Links-Protokoll behandelt Subdomains in Ihren Intent-Filtern als eindeutige, separate Hosts. Wenn Ihr Intent-Filter also mehrere Hosts mit unterschiedlichen Subdomains auflistet, müssen Sie für jede Domain eine gültige assetlinks.json veröffentlichen. Der folgende Intent-Filter enthält beispielsweise www.example.com und mobile.example.com als zulässige Intent-URL-Hosts. Ein gültiger assetlinks.json muss also sowohl unter https://www.example.com/.well-known/assetlinks.json als auch unter https://mobile.example.com/.well-known/assetlinks.json veröffentlicht werden.

<application>
  <activity android:name=”MainActivity”>
    <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:scheme="https" />
      <data android:scheme="https" />
      <data android:host="www.example.com" />
      <data android:host="mobile.example.com" />
    </intent-filter>
  </activity>
</application>

Wenn Sie Ihren Hostnamen mit einem Platzhalter (z. B. *.example.com) angeben, müssen Sie die assetlinks.json-Datei unter dem Stamm-Hostnamen (example.com) veröffentlichen. Beispiel: Eine App mit dem folgenden Intent-Filter besteht die Überprüfung für jeden Unternamen von example.com (z. B. foo.example.com), solange die assetlinks.json-Datei unter https://example.com/.well-known/assetlinks.json veröffentlicht ist:

<application>
  <activity android:name=”MainActivity”>
    <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:scheme="https" />
      <data android:host="*.example.com" />
    </intent-filter>
  </activity>
</application>

Prüfen, ob mehrere Apps mit derselben Domain verknüpft sind

Wenn Sie mehrere Apps veröffentlichen, die jeweils mit derselben Domain verknüpft sind, können sie jeweils bestätigt werden. Wenn die Apps jedoch den exakt gleichen Domainhost und Pfad auflösen können, wie es bei Lite- und Vollversionen einer App der Fall sein kann, kann nur die App, die zuletzt installiert wurde, Webintents für diese Domain auflösen.

Prüfen Sie in einem solchen Fall, ob auf dem Gerät des Nutzers möglicherweise Apps in Konflikt stehen, sofern Sie die erforderliche Paketsichtbarkeit haben. Zeigen Sie dann in Ihrer App ein benutzerdefiniertes Auswahldialogfeld mit den Ergebnissen des Aufrufs von queryIntentActivities() an. Der Nutzer kann die gewünschte App aus der Liste der übereinstimmenden Apps auswählen, die im Dialogfeld angezeigt werden.

Websiteverknüpfungen deklarieren

Auf Ihrer Website muss eine Digital Asset Links-JSON-Datei veröffentlicht werden, um die mit der Website verknüpften Android-Apps anzugeben und die URL-Intents der App zu bestätigen. In der JSON-Datei werden die folgenden Felder verwendet, um zugehörige Apps zu identifizieren:

  • package_name: Die Anwendungs-ID, die in der build.gradle-Datei der App deklariert ist.
  • sha256_cert_fingerprints: Die SHA256-Fingerabdrücke des Signaturzertifikats Ihrer App. Mit dem folgenden Befehl können Sie den Fingerabdruck über das Java-Keytool generieren:
    keytool -list -v -keystore my-release-key.keystore
    
    Dieses Feld unterstützt mehrere Fingerabdrücke, die zur Unterstützung verschiedener Versionen Ihrer App verwendet werden können, z. B. Debug- und Produktions-Builds.

    Wenn Sie die Play App-Signatur für Ihre App verwenden, stimmt der Zertifikatsfingerabdruck, der durch lokales Ausführen von keytool generiert wird, in der Regel nicht mit dem auf den Geräten der Nutzer überein. Ob Sie die Play App-Signatur für Ihre App verwenden, können Sie in Ihrem Play Console-Entwicklerkonto unter Release > Setup > App signing prüfen. Wenn ja, finden Sie auf derselben Seite auch das richtige Digital Asset Links-JSON-Snippet für Ihre App.

In der folgenden Beispieldatei assetlinks.json werden einer com.example-Android-App die Rechte zum Öffnen von Links gewährt:

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

Website mit mehreren Apps verknüpfen

Eine Website kann Verknüpfungen mit mehreren Apps in derselben assetlinks.json-Datei deklarieren. Die folgende Dateiliste zeigt ein Beispiel für eine Erklärungsdatei, die die Verknüpfung mit zwei Apps separat deklariert und sich unter https://www.example.com/.well-known/assetlinks.json befindet:

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example.puppies.app",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
  },
  {
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example.monkeys.app",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

Unterschiedliche Apps können Links für verschiedene Ressourcen unter demselben Webhost verarbeiten. Beispielsweise kann App 1 einen Intent-Filter für https://example.com/articles und App 2 einen Intent-Filter für https://example.com/videos deklarieren.

Hinweis:Mehrere mit einer Domain verknüpfte Apps können mit demselben oder verschiedenen Zertifikaten signiert sein.

Mehrere Websites mit einer App verknüpfen

Mehrere Websites können Verknüpfungen mit derselben App in den jeweiligen assetlinks.json-Dateien deklarieren. Die folgenden Dateieinträge zeigen ein Beispiel dafür, wie die Verknüpfung von beispiel.de und beispiel.net mit app1 deklariert wird. Der erste Eintrag zeigt die Verknüpfung von beispiel.de mit app1:

https://www.example.com/.well-known/assetlinks.json

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.mycompany.app1",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

Der nächste Eintrag zeigt die Verknüpfung von beispiel.net mit app1. Nur der Ort, an dem diese Dateien gehostet werden, unterscheidet sich (.com und .net):

https://www.example.net/.well-known/assetlinks.json

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.mycompany.app1",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

JSON-Bestätigungsdatei veröffentlichen

Sie müssen Ihre JSON-Bestätigungsdatei an folgendem Ort veröffentlichen:

https://domain.name/.well-known/assetlinks.json

Achten Sie auf Folgendes:

  • Die assetlinks.json-Datei wird mit dem Inhaltstyp application/json bereitgestellt.
  • Auf die assetlinks.json-Datei muss über eine HTTPS-Verbindung zugegriffen werden können, unabhängig davon, ob im Intent-Filter Ihrer App HTTPS als Datenschema angegeben ist.
  • Auf die assetlinks.json-Datei muss ohne Weiterleitungen zugegriffen werden können (keine 301- oder 302-Weiterleitungen).
  • Wenn Ihre App-Links mehrere Hostdomains unterstützen, müssen Sie die assetlinks.json-Datei auf jeder Domain veröffentlichen. Weitere Informationen finden Sie unter Unterstützung von Anwendungsverknüpfungen für mehrere Hosts.
  • Veröffentlichen Sie Ihre App nicht mit Entwicklungs-/Test-URLs in der Manifestdatei, die möglicherweise nicht öffentlich zugänglich sind (z. B. solche, die nur über VPN zugänglich sind). In solchen Fällen können Sie das Problem umgehen, indem Sie Build-Varianten konfigurieren, um eine andere Manifestdatei für Entwicklungs-Builds zu generieren.

Bestätigung von Android-App-Links

Wenn android:autoVerify="true" in mindestens einem Intent-Filter Ihrer App vorhanden ist, führt das Installieren der App auf einem Gerät mit Android 6.0 (API-Level 23) oder höher dazu, dass das System automatisch die Hosts überprüft, die mit den URLs in den Intent-Filtern Ihrer App verknüpft sind. Unter Android 12 und höher können Sie die Bestätigung auch manuell starten, um die Bestätigungslogik zu testen.

Automatische Bestätigung

Die automatische Überprüfung des Systems umfasst Folgendes:

  1. Das System prüft alle Intent-Filter, die Folgendes enthalten:
    • Aktion: android.intent.action.VIEW
    • Kategorien: android.intent.category.BROWSABLE und android.intent.category.DEFAULT
    • Datenschema: http oder https
  2. Für jeden eindeutigen Hostnamen, der in den oben genannten Intent-Filtern gefunden wird, sucht Android auf den entsprechenden Websites nach der Datei „Digital Asset Links“ unter https://hostname/.well-known/assetlinks.json.

Nachdem Sie die Liste der Websites, die mit Ihrer Anwendung verknüpft werden sollen, und die Gültigkeit der gehosteten JSON-Datei überprüft haben, installieren Sie die App auf Ihrem Gerät. Warten Sie mindestens 20 Sekunden, bis die asynchrone Überprüfung abgeschlossen ist. Mit dem folgenden Befehl können Sie prüfen, ob das System Ihre App überprüft und die richtigen Richtlinien für die Linkverwaltung festgelegt hat:

adb shell am start -a android.intent.action.VIEW \
    -c android.intent.category.BROWSABLE \
    -d "http://domain.name:optional_port"

Manuelle Bestätigung

Ab Android 12 können Sie die Domainbestätigung für eine App, die auf einem Gerät installiert ist, manuell aufrufen. Sie können diesen Vorgang unabhängig davon ausführen, ob Ihre App auf Android 12 ausgerichtet ist.

Internetverbindung herstellen

Damit die Domainbestätigung durchgeführt werden kann, muss Ihr Testgerät mit dem Internet verbunden sein.

Den aktualisierten Domainbestätigungsprozess unterstützen

Wenn Ihre App auf Android 12 oder höher ausgerichtet ist, verwendet das System automatisch den aktualisierten Domainbestätigungsprozess.

Andernfalls können Sie den aktualisierten Bestätigungsprozess manuell aktivieren. Führen Sie dazu in einem Terminalfenster den folgenden Befehl aus:

adb shell am compat enable 175408749 PACKAGE_NAME

Status von Android-App-Links auf einem Gerät zurücksetzen

Bevor Sie die Domainbestätigung auf einem Gerät manuell aufrufen, müssen Sie den Status der Android App-Links auf dem Testgerät zurücksetzen. Führen Sie dazu den folgenden Befehl in einem Terminalfenster aus:

adb shell pm set-app-links --package PACKAGE_NAME 0 all

Mit diesem Befehl wird das Gerät in den Zustand versetzt, in dem es sich befand, bevor der Nutzer Standard-Apps für Domains ausgewählt hat.

Domainbestätigungsprozess starten

Nachdem Sie den Status von Android App-Links auf einem Gerät zurückgesetzt haben, können Sie die Bestätigung selbst durchführen. Führen Sie dazu den folgenden Befehl in einem Terminalfenster aus:

adb shell pm verify-app-links --re-verify PACKAGE_NAME

Ergebnisse der Überprüfung prüfen

Nachdem der Prüfer seine Anfragen abgeschlossen hat, können Sie die Ergebnisse der Überprüfung prüfen. Führen Sie dazu den folgenden Befehl aus:

adb shell pm get-app-links PACKAGE_NAME

Die Ausgabe dieses Befehls sieht in etwa so aus:

com.example.pkg:
    ID: 01234567-89ab-cdef-0123-456789abcdef
    Signatures: [***]
    Domain verification state:
      example.com: verified
      sub.example.com: legacy_failure
      example.net: verified
      example.org: 1026

Domains, die die Bestätigung bestehen, haben den Status „verified“. Bei jedem anderen Status konnte die Domainbestätigung nicht durchgeführt werden. Insbesondere bedeutet der Status none, dass der Kundenservicemitarbeiter den Bestätigungsprozess möglicherweise noch nicht abgeschlossen hat.

In der folgenden Liste sind die möglichen Rückgabewerte aufgeführt, die bei der Domainbestätigung für eine bestimmte Domain zurückgegeben werden können:

none
Für diese Domain wurde nichts aufgezeichnet. Warten Sie noch einige Minuten, bis der Bestätigungsagent die Anfragen im Zusammenhang mit der Domainbestätigung abgeschlossen hat, und rufen Sie den Domainbestätigungsprozess noch einmal auf.
verified
Die Domain wurde für die deklarierende App bestätigt.
approved
Die Domain wurde erzwungen genehmigt, in der Regel durch Ausführen eines Shell-Befehls.
denied
Die Domain wurde erzwungen, in der Regel durch Ausführen eines Shell-Befehls.
migrated
Das System hat das Ergebnis eines vorherigen Prozesses beibehalten, bei dem die bisherige Domainbestätigung verwendet wurde.
restored
Die Domain wurde genehmigt, nachdem der Nutzer eine Datenwiederherstellung durchgeführt hat. Es wird davon ausgegangen, dass die Domain bereits bestätigt wurde.
legacy_failure
Die Domain wurde von einem alten Verifier abgelehnt. Der genaue Grund für den Fehler ist unbekannt.
system_configured
Die Domain wurde automatisch von der Gerätekonfiguration genehmigt.
Fehlercode 1024 oder höher

Benutzerdefinierter Fehlercode, der für den Prüfer des Geräts spezifisch ist.

Prüfen Sie, ob Sie eine Netzwerkverbindung hergestellt haben, und rufen Sie den Domainbestätigungsprozess noch einmal auf.

Nutzer bitten, Ihre App mit einer Domain zu verknüpfen

Eine weitere Möglichkeit, wie Ihre App für eine Domain genehmigt werden kann, besteht darin, den Nutzer zu bitten, Ihre App mit dieser Domain zu verknüpfen.

Prüfen, ob Ihre App bereits für die Domain genehmigt wurde

Bevor Sie den Nutzer auffordern, prüfen Sie, ob Ihre Anwendung der Standard-Handler für die Domains ist, die Sie in den <intent-filter>-Elementen definieren. Sie können den Genehmigungsstatus mit einer der folgenden Methoden abfragen:

DomainVerificationManager

Das folgende Code-Snippet zeigt, wie die DomainVerificationManager API verwendet wird:

Kotlin

val context: Context = TODO("Your activity or fragment's Context")
val manager = context.getSystemService(DomainVerificationManager::class.java)
val userState = manager.getDomainVerificationUserState(context.packageName)

// Domains that have passed Android App Links verification.
val verifiedDomains = userState?.hostToStateMap
    ?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_VERIFIED }

// Domains that haven't passed Android App Links verification but that the user
// has associated with an app.
val selectedDomains = userState?.hostToStateMap
    ?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_SELECTED }

// All other domains.
val unapprovedDomains = userState?.hostToStateMap
    ?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_NONE }

Java

Context context = TODO("Your activity or fragment's Context");
DomainVerificationManager manager =
        context.getSystemService(DomainVerificationManager.class);
DomainVerificationUserState userState =
        manager.getDomainVerificationUserState(context.getPackageName());

Map<String, Integer> hostToStateMap = userState.getHostToStateMap();
List<String> verifiedDomains = new ArrayList<>();
List<String> selectedDomains = new ArrayList<>();
List<String> unapprovedDomains = new ArrayList<>();
for (String key : hostToStateMap.keySet()) {
    Integer stateValue = hostToStateMap.get(key);
    if (stateValue == DomainVerificationUserState.DOMAIN_STATE_VERIFIED) {
        // Domain has passed Android App Links verification.
        verifiedDomains.add(key);
    } else if (stateValue == DomainVerificationUserState.DOMAIN_STATE_SELECTED) {
        // Domain hasn't passed Android App Links verification, but the user has
        // associated it with an app.
        selectedDomains.add(key);
    } else {
        // All other domains.
        unapprovedDomains.add(key);
    }
}

Befehlszeilenprogramm

Wenn Sie Ihre App während der Entwicklung testen, können Sie mit dem folgenden Befehl den Überprüfungsstatus der Domains abfragen, die Ihrer Organisation gehören:

adb shell pm get-app-links --user cur PACKAGE_NAME

In der folgenden Beispielausgabe wurde die App zwar nicht für die Domain „beispiel.de“ bestätigt, Nutzer 0 hat sie aber in den Systemeinstellungen manuell genehmigt und kein anderes Paket ist für diese Domain bestätigt.

com.example.pkg:
ID: ***
Signatures: [***]
Domain verification state:
  example.com: verified
  example.net: verified
  example.org: 1026
User 0:
  Verification link handling allowed: true
  Selection state:
    Enabled:
      example.org
    Disabled:
      example.com
      example.net

Sie können auch Shell-Befehle verwenden, um den Vorgang zu simulieren, bei dem der Nutzer auswählt, welche App mit einer bestimmten Domain verknüpft ist. Eine vollständige Erklärung dieser Befehle finden Sie in der Ausgabe von adb shell pm.

Kontext für die Anfrage angeben

Bevor Sie die Domaingenehmigung beantragen, sollten Sie dem Nutzer etwas Kontext geben. Sie können beispielsweise einen Startbildschirm, ein Dialogfeld oder ein ähnliches UI-Element anzeigen, in dem den Nutzern erklärt wird, warum Ihre App der Standard-Handler für eine bestimmte Domain sein sollte.

Anfrage stellen

Nachdem der Nutzer verstanden hat, was von ihm in Ihrer App verlangt wird, können Sie die Anfrage stellen. Rufen Sie dazu einen Intent auf, der die Intent-Aktion ACTION_APP_OPEN_BY_DEFAULT_SETTINGS und einen Datenstring enthält, der mit package:com.example.pkg für die Ziel-App übereinstimmt, wie im folgenden Code-Snippet gezeigt:

Kotlin

val context: Context = TODO("Your activity or fragment's Context")
val intent = Intent(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS,
    Uri.parse("package:${context.packageName}"))
context.startActivity(intent)

Java

Context context = TODO("Your activity or fragment's Context");
Intent intent = new Intent(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS,
    Uri.parse("package:" + context.getPackageName()));
context.startActivity(intent);

Wenn die Intent aufgerufen wird, sehen Nutzer den Einstellungsbildschirm Standardmäßig öffnen. Dieser Bildschirm enthält ein Optionsfeld namens Open supported links (Unterstützte Links öffnen), wie in Abbildung 1 dargestellt.

Wenn der Nutzer Unterstützte Links öffnen aktiviert, werden unter dem Abschnitt Links zum Öffnen in dieser App mehrere Kästchen angezeigt. Anschließend können Nutzer die Domains auswählen, die sie mit Ihrer App verknüpfen möchten. Sie können auch Link hinzufügen auswählen, um Domains hinzuzufügen (siehe Abbildung 2). Wenn Nutzer später einen Link innerhalb der hinzugefügten Domains auswählen, wird der Link automatisch in Ihrer App geöffnet.

Wenn das Optionsfeld aktiviert ist, finden Sie unten im Abschnitt Kästchen sowie die Schaltfläche „Link hinzufügen“.
Abbildung 1. Bildschirm „Systemeinstellungen“, auf dem Nutzer auswählen können, welche Links standardmäßig in deiner App geöffnet werden sollen.
Jedes Kästchen steht für eine Domain, die Sie hinzufügen können. Die Schaltflächen im Dialogfeld sind „Abbrechen“ und „Hinzufügen“.
Abbildung 2. Dialogfeld, in dem Nutzer zusätzliche Domains auswählen können, die mit Ihrer App verknüpft werden sollen.

In Ihrer App geöffnete Domains, die Ihre App nicht überprüfen kann

Die Hauptfunktion Ihrer App besteht möglicherweise darin, Links als Drittanbieter zu öffnen, ohne dass die verwalteten Domains überprüft werden können. In diesem Fall müssen Sie Nutzern erklären, dass sie beim Auswählen eines Weblinks nicht zwischen einer App des Unternehmens und Ihrer App (Drittanbieter) wählen können. Nutzer müssen die Domains manuell mit Ihrer Drittanbieter-App verknüpfen.

Sie können auch einen Dialog oder eine Trampolin-Aktivität einführen, mit der der Nutzer den Link in der App des Unternehmens öffnen kann, wenn er das bevorzugt. Bevor Sie eine solche Dialog- oder Trampolinaktivität einrichten, müssen Sie Ihre App so einrichten, dass sie Paketsichtbarkeit in den selbst gehosteten Apps hat, die mit dem Webintent-Filter Ihrer App übereinstimmen.

App-Links testen

Wenn Sie die App-Verknüpfungsfunktion implementieren, sollten Sie die Verknüpfungsfunktion testen, um sicherzustellen, dass das System Ihre App mit Ihren Websites verknüpfen und URL-Anfragen wie erwartet verarbeiten kann.

Zum Testen einer vorhandenen Anweisungsdatei können Sie das Tool Statement List Generator und Tester verwenden.

Liste der zu bestätigenden Hosts bestätigen

Prüfen Sie beim Testen die Liste der verknüpften Hosts, die das System für Ihre App überprüfen soll. Erstellen Sie eine Liste aller URLs, deren entsprechende Intent-Filter die folgenden Attribute und Elemente enthalten:

  • android:scheme-Attribut mit dem Wert http oder https
  • android:host-Attribut mit einem Domain-URL-Muster
  • android.intent.action.VIEW-Aktionselement
  • android.intent.category.BROWSABLE-Element „Kategorie“

Anhand dieser Liste können Sie prüfen, ob für jeden angegebenen Host und jede Subdomain eine Digital Asset Links-JSON-Datei bereitgestellt wird.

Digital Asset Links-Dateien bestätigen

Prüfen Sie für jede Website mit der Digital Asset Links API, ob die Digital Asset Links-JSON-Datei richtig gehostet und definiert ist:

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

Im Rahmen des Testverfahrens können Sie die aktuellen Systemeinstellungen für die Linkverwaltung prüfen. Mit dem folgenden Befehl erhalten Sie eine Liste der vorhandenen Richtlinien für die Linkverwaltung für alle Apps auf Ihrem verbundenen Gerät:

adb shell dumpsys package domain-preferred-apps

Oder der folgende Befehl führt das Gleiche aus:

adb shell dumpsys package d

Hinweis:Warten Sie nach der Installation Ihrer App mindestens 20 Sekunden, damit das System die Überprüfung abschließen kann.

Der Befehl gibt eine Liste aller Nutzer oder Profile zurück, die auf dem Gerät definiert sind. Vorangestellt ist eine Überschrift im folgenden Format:

App linkages for user 0:

Nach dieser Überschrift werden in der Ausgabe die Einstellungen für die Linkbehandlung für diesen Nutzer im folgenden Format aufgeführt:

Package: com.android.vending
Domains: play.google.com market.android.com
Status: always : 200000002

Diese Liste gibt an, welche Apps mit welchen Domains des jeweiligen Nutzers verknüpft sind:

  • Package: Identifiziert eine App anhand des Paketnamens, wie im Manifest angegeben.
  • Domains – Die vollständige Liste der Hosts, deren Weblinks von dieser App verarbeitet werden, wobei Leerzeichen als Trennzeichen verwendet werden.
  • Status: Die aktuelle Einstellung für die Linkverwaltung für diese App. Eine App, die die Überprüfung bestanden hat und deren Manifest android:autoVerify="true" enthält, hat den Status always. Die Hexadezimalzahl nach diesem Status bezieht sich auf den Eintrag der App-Verknüpfungseinstellungen des Nutzers im Android-System. Dieser Wert gibt nicht an, ob die Überprüfung erfolgreich war.

Hinweis:Wenn ein Nutzer die App-Link-Einstellungen für eine Anwendung ändert, bevor die Bestätigung abgeschlossen ist, wird für eine erfolgreiche Überprüfung möglicherweise ein falsch positives Ergebnis angezeigt, auch wenn die Überprüfung fehlgeschlagen ist. Dieser Bestätigungsfehler spielt jedoch keine Rolle, wenn der Nutzer der App ausdrücklich erlaubt hat, unterstützte Links ohne Nachfrage zu öffnen. Das liegt daran, dass Nutzereinstellungen Vorrang vor der programmatischen Überprüfung (oder wenn diese nicht vorhanden sind) haben. Der Link führt dann direkt zu Ihrer App, ohne dass ein Dialogfeld angezeigt wird, als wäre die Überprüfung erfolgreich gewesen.

Testbeispiel

Damit die Bestätigung des App-Links erfolgreich ist, muss das System Ihre App mit jeder der Websites verifizieren können, die Sie in einem bestimmten Intent-Filter angeben, der die Kriterien für App-Links erfüllt. Das folgende Beispiel zeigt eine Manifestkonfiguration mit mehreren App-Links:

<application>

    <activity android:name=”MainActivity”>
        <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:scheme="https" />
            <data android:scheme="https" />
            <data android:host="www.example.com" />
            <data android:host="mobile.example.com" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="https" />
            <data android:host="www.example2.com" />
        </intent-filter>
    </activity>

    <activity android:name=”SecondActivity”>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="https" />
            <data android:host="account.example.com" />
        </intent-filter>
    </activity>

      <activity android:name=”ThirdActivity”>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="https" />
            <data android:host="map.example.com" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="market" />
            <data android:host="example.com" />
        </intent-filter>
      </activity>

</application>

Die Liste der Hosts, die die Plattform anhand des obigen Manifests bestätigen würde, lautet:

www.example.com
mobile.example.com
www.example2.com
account.example.com

Die Liste der Hosts, die die Plattform nicht anhand des obigen Manifests überprüfen würde, lautet:

map.example.com (it does not have android.intent.category.BROWSABLE)
market://example.com (it does not have either an "http" or "https" scheme)

Weitere Informationen zu Erklärungslisten finden Sie unter Erklärungsliste erstellen.

Häufige Implementierungsfehler beheben

Wenn Sie Ihre Android-App-Links nicht bestätigen können, prüfen Sie, ob einer der folgenden häufigen Fehler vorliegt. In diesem Abschnitt wird example.com als Platzhalter-Domainname verwendet. Ersetzen Sie bei diesen Prüfungen example.com durch den tatsächlichen Domainnamen Ihres Servers.

Falscher Intent-Filter eingerichtet
Prüfe, ob in einem <intent-filter>-Element eine URL enthalten ist, die nicht zu deiner App gehört.
Falsche Serverkonfiguration

Prüfe die JSON-Konfiguration deines Servers und achte darauf, dass der SHA-Wert korrekt ist.

Prüfen Sie außerdem, ob example.com. (mit dem abschließenden Punkt) denselben Inhalt wie example.com bereitstellt.

Serverseitige Weiterleitungen

Das System prüft keine Android-App-Links für Ihre App, wenn Sie eine Weiterleitung wie die folgende einrichten:

  • http://example.com bis https://example.com
  • example.com bis www.example.com

Dadurch wird die Sicherheit Ihrer App geschützt.

Serverrobustheit

Prüfen Sie, ob Ihr Server eine Verbindung zu Ihren Client-Apps herstellen kann.

Nicht überprüfbare Links

Zu Testzwecken können Sie absichtlich nicht überprüfbare Links hinzufügen. Unter Android 11 und niedriger führen solche Links dazu, dass das System nicht alle Android-App-Links für Ihre App überprüft.

Falsche Signatur in assetlinks.json

Prüfen Sie, ob Ihre Unterschrift korrekt ist und mit der Unterschrift übereinstimmt, die zum Signieren Ihrer App verwendet wurde. Häufige Fehler:

  • App mit einem Debug-Zertifikat signieren und nur die Release-Signatur in assetlinks.json verwenden
  • Eine Signatur in Kleinbuchstaben in assetlinks.json. Die Unterschrift muss in Großbuchstaben geschrieben sein.
  • Wenn Sie die Play App-Signatur verwenden, achten Sie darauf, dass Sie die Signatur verwenden, mit der Google jeden Ihrer Releases signiert. Sie können diese Details, einschließlich eines vollständigen JSON-Snippets, überprüfen. Folgen Sie dazu der Anleitung zum Deklarieren von Websiteverknüpfungen.