Intent-Filter für App-Links hinzufügen

App-Links sind Deeplinks, die das HTTP- oder HTTPS-Schema verwenden und von Android als mit Ihrer Website verknüpft bestätigt wurden. So registrieren Sie sich für die Verarbeitung von App-Links:

  1. Fügen Sie Ihrem App-Manifest einen oder mehrere Intent-Filter hinzu, die die Domain oder URLs Ihrer Website angeben.
  2. Fügen Sie den Intent-Filterelementen die autoVerify="true"attribute hinzu. Dadurch wird dem System signalisiert, dass es versuchen soll, die Schema- und Hostdomains mit der assetlinks.json-Konfiguration deiner Website abzugleichen.
  3. Websiteverknüpfungen deklarieren

Das folgende Beispiel zeigt eine App-Link-Deklaration mit Schemas und Hosts sowie autoVerify="true:

<activity
    android:name=".MainActivity"
    android:exported="true"
    ...>
    <!-- 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 link that uses the "http" scheme, your
             app should be able to delegate that traffic to "https". -->
        <!-- Do not include other schemes, as this will prevent verification. -->
        <data android:scheme="http" />
        <data android:scheme="https" />

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

Wichtige Punkte zum Code

  • AutoVerify: Das Attribut android:autoVerify="true" ist für App-Links erforderlich. Es signalisiert dem System, dass es versuchen soll, die Verknüpfung zwischen Ihrer App und den in den <data>-Tags angegebenen Schemas und Domains zu bestätigen. Es wird empfohlen, jedem Intent-Filter, der verifizierbar sein soll, autoVerify="true" hinzuzufügen.
  • Datenelemente: Jeder Intent-Filter für App-Links muss ein oder mehrere <data>-Elemente enthalten, die die Schemas und Hostformate angeben, die mit Ihrer verifizierbaren Websitedomain übereinstimmen.
  • Schemas: Der Intent-Filter muss <data>-Elemente für die Schemas http und https enthalten.
  • Hosts: Sie können optional <data>-Elemente hinzufügen, um einen oder mehrere Hosts abzugleichen. Verwenden Sie einen Platzhalter (*), um mehrere Subdomains (z. B. *.example.com) abzugleichen. Das System versucht, jeden Host mit der Datei „assetlinks.json“ auf Ihrer Website zu vergleichen. Beachten Sie, dass das Routing auf Pfadebene über die Datei „assetlinks.json“ erfolgen sollte (siehe Abschnitt „Best Practices“ unten).

  • Mehrere Hosts: Wenn du mehrere Hostdomains deklarierst, versucht das System (unter Android 12 oder höher), jede einzelne zu bestätigen. Wenn ein Host bestätigt wird, wird die App zum Standard-Handler für Links von diesem bestätigten Host. Unter Android 11 und niedriger schlägt die Überprüfung fehl, wenn auch nur ein Host nicht überprüft werden kann.

  • Mehrere Intent-Filter: Wenn du eindeutige URLs deklarieren möchtest, z. B. eine bestimmte Kombination aus Schema und Host, ist es wichtig, separate Filter zu erstellen. Mehrere <data>-Elemente im selben Intent-Filter werden nämlich zusammengeführt, um alle Varianten ihrer kombinierten Attribute zu berücksichtigen.

Hinweise zu Manifestfilterregeln

Wenn Sie Filter für die Verwendung mit dynamischen App-Links in Android 15 und höher einrichten, sollten Sie beachten, dass die in der serverseitigen Datei „assetlinks.json“ deklarierten dynamischen Regeln den Bereich der URL-Regeln, die Sie statisch in Ihrem App-Manifest deklarieren, nicht erweitern können.

Aus diesem Grund empfehlen wir die folgende Vorgehensweise:

  • Legen Sie in Ihrem App-Manifest den größtmöglichen Bereich fest, z. B. indem Sie nur Schema und Domain deklarieren.
  • Verwenden Sie die serverseitigen assetlinks.json-Regeln für weitere Anpassungen, z. B. Routing auf Pfadebene.

Mit dieser idealen Konfiguration können Sie bei Bedarf dynamisch neue App-Link-Pfade in der Datei assetlinks.json hinzufügen, da Sie wissen, dass sie in den breiten Bereich passen, den Sie im App-Manifest festgelegt haben.

App-Links für mehrere Hosts unterstützen

Das System muss den Host, der in den Datenelementen der URL-Intent-Filter der App angegeben ist, mit den Digital Asset Links-Dateien abgleichen können, die auf den entsprechenden Webdomains in diesem Intent-Filter gehostet werden. Wenn die Überprüfung fehlschlägt, wird das Standardverhalten des Systems verwendet, 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 verifiziert werden, die in den anderen Intent-Filtern der App definiert sind.

Eine App mit den folgenden Intent-Filtern würde beispielsweise nur für https://www.example.com die Überprüfung bestehen, 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>

Unterstützung von App-Verknüpfungen für mehrere Subdomains

Das Digital Asset Links-Protokoll behandelt Subdomains in Ihren Intent-Filtern als eindeutige, separate Hosts. Wenn dein Intent-Filter also mehrere Hosts mit unterschiedlichen Subdomains enthält, musst du auf jeder Domain eine gültige assetlinks.json veröffentlichen. Der folgende Intent-Filter enthält beispielsweise www.example.com und mobile.example.com als akzeptierte Intent-URL-Hosts. Eine gültige 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) deklarieren, müssen Sie die Datei assetlinks.json im Stammhostnamen (example.com) veröffentlichen. Eine App mit dem folgenden Intent-Filter besteht beispielsweise die Überprüfung für jeden Subnamen von example.com (z. B. foo.example.com), solange die Datei assetlinks.json unter https://example.com/.well-known/assetlinks.json veröffentlicht 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="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 alle erfolgreich bestätigt werden. Wenn die Apps jedoch genau denselben Domainhost und -pfad auflösen können, wie es bei Lite- und Vollversionen einer App der Fall sein kann, kann nur die zuletzt installierte App Web-Intents für diese Domain auflösen.

In einem solchen Fall solltest du auf dem Gerät des Nutzers nach möglichen in Konflikt stehenden Apps suchen, sofern du die erforderliche Paketsichtbarkeit hast. Zeige dann in deiner App ein benutzerdefiniertes Auswahldialogfeld mit den Ergebnissen des Aufrufs von queryIntentActivities an. Der Nutzer kann seine bevorzugte App aus der Liste der übereinstimmenden Apps auswählen, die im Dialogfeld angezeigt werden.

Dynamische App-Link-Funktionen, einschließlich erweiterter Abgleichsregeln in assetlinks.json und der Verwendung von <uri-relative-filter-group>, werden nur unter Android 15 (API-Level 35) und höher vollständig unterstützt.

Unter Android 14 (API-Level 34) und niedriger berücksichtigt das System nur die scheme und host, die in den <data>-Elementen Ihres Manifests deklariert sind, für die App-Link-Überprüfung. Pfadspezifische Regeln, Ausschlüsse und dynamische Updates aus „assetlinks.json“ werden nicht angewendet.

Wenn in Ihrem Manifest nur scheme und host angegeben sind, erfasst Ihre App unter Android 14 und niedriger möglicherweise unerwartet alle Pfade für die bestätigte Domain, unabhängig von den pfadspezifischen Regeln, die in Ihrer assetlinks.json für Android 15 und höher definiert sind.

Wenn Sie verhindern möchten, dass Ihre App unter Android 14 und niedriger alle Links für eine Domain verarbeitet, wenn Sie dynamische App-Links für spezifischere Pfade unter Android 15 und höher verwenden möchten, fügen Sie dem Intent-Filter Ihres Manifests einen nicht übereinstimmenden Pfad hinzu. Fügen Sie ein <data>-Element mit einem android:path-Attribut hinzu, das wahrscheinlich nie ein gültiger Pfad für Ihre Links sein wird. Dadurch wird sichergestellt, dass der Intent-Filter nicht mit allen Pfaden in niedrigeren Versionen übereinstimmt.

Beispiel:

<activity
    android:name=".MainActivity"
    android:exported="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" />

        <data android:scheme="http" />
        <data android:scheme="https" />
        <data android:host="www.example.com" />

        <!-- Add a non-matching path for backward compatibility -->
        <data android:path="/no_match_for_older_android_versions" />

        <uri-relative-filter-group android:allow="true">
          <data android:pathPattern="/.*"/>
        </uri-relative-filter-group>
    </intent-filter>
</activity>

Wenn Sie <data android:path="/no_match_for_older_android_versions" /> hinzufügen, wird dieser Intent-Filter unter Android 14 und niedriger nicht mit eingehenden Links abgeglichen. Gleichzeitig kann die Domain für die Verwendung mit dynamischen App-Links unter Android 15 und höher basierend auf den erweiterten Abgleichsregeln in Ihren assetlinks.json-Regeln bestätigt werden.

Wenn Sie bereits App-Links mit bestimmten Pfadregeln (z. B. android:pathPrefix) in Ihrem Manifest haben und dynamische App-Links unter Android 15 und höher verwenden möchten, können Sie das Element <uri-relative-filter-group> direkt Ihren vorhandenen Intent-Filtern hinzufügen.

Da Android 14 und niedriger das Element <uri-relative-filter-group> ignorieren, funktionieren Ihre vorhandenen App-Links auf Geräten mit niedrigeren Android-Versionen weiterhin genau wie jetzt.

Sie müssen jedoch sorgfältig prüfen, wie Android 15 und höher die „gemischte“ Konfiguration bewertet:

  • Zweistufige Filterung:Unter Android 15 und höher wertet das System Intent-Filter als Union aus. Eine URL besteht die Manifestprüfung, wenn sie entweder Ihren alten statischen <data>-Tags oder den allgemeinen Regeln in Ihrer <uri-relative-filter-group> entspricht. Sobald die URL diese erste Manifestprüfung bestanden hat, wendet das System die in der Datei assetlinks.json definierten dynamischen Regeln als zweite Ebene der detaillierten Filterung an. Das bedeutet, dass die serverseitigen JSON-Regeln letztendlich bestimmen, welche der übereinstimmenden URLs die App tatsächlich öffnen.

Beispiel für eine Hybridkonfiguration:

<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="www.example.com" />

    <!-- Legacy rule: Android 14 and lower use this. Android 15 and higher
         also use this. -->
    <data android:pathPrefix="/store" />

    <!--
      Dynamic rule: Android 14 and lower ignore this. Android 15 and higher
      evaluate this as a union between all paths and the configuration
      specified in the assetlinks.json file. Make sure to apply further
      refinements in the assetlinks.json file to prevent all URL paths from
      opening in the app.
    -->
    <uri-relative-filter-group android:allow="true">
        <data android:pathPrefix="/" />
    </uri-relative-filter-group>
</intent-filter>