הוספת מסנני Intent לקישורי אפליקציות

קישורי עומק לאפליקציות הם קישורי עומק שמשתמשים בסכימת HTTP או HTTPS, ומערכת Android מאמתת שהם משויכים לאתר שלכם. כדי להירשם לטיפול בקישורים לאפליקציות, פועלים לפי השלבים הבאים:

  1. מוסיפים מסנן Intent אחד או יותר לקובץ המניפסט של האפליקציה שמציין את הדומיין או את כתובות ה-URL של האתר.
  2. מוסיפים את autoVerify="true"attribute לרכיבים של מסנן ה-Intent. כך המערכת יודעת שהיא צריכה לנסות לאמת את הסכימה ואת הדומיינים המארחים מול הגדרות ה-assetlinks.json של האתר.
  3. הצהרה על שיוכים לאתרים.

הדוגמה הבאה היא הצהרה על קישור לאפליקציה עם סכימות ומארחים, וגם 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>

מידע חשוב על הקוד

  • ‫AutoVerify: המאפיין android:autoVerify="true" נדרש לקישורי עומק לאפליקציה. הוא מאותת למערכת שהיא צריכה לנסות לאמת את השיוך בין האפליקציה לבין הסכימות והדומיינים שצוינו בתגי <data>. מומלץ להוסיף את autoVerify="true" לכל מסנן Intent שרוצים שיהיה ניתן לאימות.
  • רכיבי נתונים: כל מסנן Intent של קישורי אפליקציה חייב לכלול רכיב <data> אחד או יותר, שמציין את הסכימות והפורמטים של המארח שתואמים לדומיין של האתר שניתן לאמת.
  • סכימות: מסנן ה-Intent חייב לכלול רכיבי <data> גם לסכימות http וגם לסכימות https.
  • מארחים: אפשר להוסיף רכיבי <data> כדי להתאים למארח אחד או יותר. אפשר להשתמש בתו כללי לחיפוש (*) כדי להתאים לכמה תת-דומיינים (כמו *.example.com). המערכת תנסה לאמת כל מארח מול קובץ assetlinks.json באתר. חשוב לזכור שכל ניתוב ברמת הנתיב צריך להתבצע באמצעות הקובץ assetlinks.json (ראו את הקטע "שיטות מומלצות" בהמשך).

  • מארחים מרובים: אם מצהירים על כמה דומיינים מארחים, המערכת (ב-Android מגרסה 12 ואילך) מנסה לאמת כל אחד מהם. אם מארח כלשהו מאומת, האפליקציה הופכת ל-handler שמוגדר כברירת מחדל לקישורים מהמארח המאומת הזה. ב-Android מגרסה 11 ומטה, האימות נכשל אם אי אפשר לאמת אפילו מארח אחד.

  • מסנני Intent מרובים: חשוב ליצור מסננים נפרדים כשרוצים להצהיר על כתובות URL ייחודיות (כמו שילוב ספציפי של סכימה ומארח), כי כמה רכיבי <data> באותו מסנן Intent מתמזגים יחד כדי להביא בחשבון את כל הווריאציות של המאפיינים המשולבים שלהם.

שיקולים לגבי כללי סינון של קובצי מניפסט

אם אתם מגדירים מסננים לשימוש עם קישורי עומק דינמיים לאפליקציה ב-Android מגרסה 15 ואילך, חשוב לזכור שהכללים הדינמיים שהצהרתם עליהם בקובץ assetlinks.json בצד השרת לא יכולים להרחיב את ההיקף של כללי כתובות ה-URL שהצהרתם עליהם באופן סטטי בקובץ המניפסט של האפליקציה.

לכן, מומלץ להשתמש בגישה הזו:

  • בקובץ המניפסט של האפליקציה, מגדירים את ההיקף הרחב ביותר האפשרי, למשל על ידי הצהרה על סכימה ודומיין בלבד.
  • כדי לבצע שיפורים נוספים, כמו ניתוב ברמת הנתיב, צריך להסתמך על הכללים של assetlinks.json בצד השרת.

ההגדרה האידיאלית הזו תאפשר לכם להוסיף באופן דינמי נתיבים חדשים של קישורים לאפליקציה בקובץ assetlinks.json לפי הצורך, בידיעה שהם יתאימו להיקף הרחב שהגדרתם בקובץ המניפסט של האפליקציה.

תמיכה בקישורים לאפליקציות בכמה מארחים

המערכת צריכה להיות מסוגלת לאמת את המארח שצוין ברכיבי הנתונים של מסנני ה-Intent של כתובת ה-URL של האפליקציה, מול קובצי Digital Asset Links שמתארחים בדומיינים המתאימים באינטרנט במסנן ה-Intent הזה. אם האימות נכשל, המערכת חוזרת להתנהגות הרגילה שלה כדי לפתור את ה-intent, כפי שמתואר במאמר יצירת קישורי עומק לתוכן של אפליקציה. עם זאת, עדיין אפשר לאמת את האפליקציה כרכיב handler שמוגדר כברירת מחדל לכל אחת מתבניות ה-URL שמוגדרות במסנני Intent אחרים של האפליקציה.

לדוגמה, אפליקציה עם מסנני ה-Intent הבאים תעבור את האימות רק עבור https://www.example.com אם נמצא קובץ assetlinks.json ב-https://www.example.com/.well-known/assetlinks.json אבל לא ב-https://www.example.net/.well-known/assetlinks.json:

<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>

תמיכה בקישור אפליקציות לכמה תת-דומיינים

פרוטוקול Digital Asset Links מתייחס לתת-דומיינים במסנני Intent כמארחים ייחודיים ונפרדים. לכן, אם מסנן ה-Intent כולל כמה מארחים עם תת-דומיינים שונים, צריך לפרסם קובץ assetlinks.json תקין בכל דומיין. לדוגמה, מסנן ה-Intent הבא כולל את www.example.com ואת mobile.example.com כמארחים מקובלים של כתובות URL של Intent. לכן צריך לפרסם assetlinks.json חוקי גם ב-https://www.example.com/.well-known/assetlinks.json וגם ב-https://mobile.example.com/.well-known/assetlinks.json.

<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>

לחלופין, אם אתם מצהירים על שם המארח באמצעות תו כללי לחיפוש (כמו *.example.com), אתם צריכים לפרסם את קובץ assetlinks.json בשם המארח ברמה הבסיסית (example.com). לדוגמה, אפליקציה עם מסנן ה-Intent הבא תעבור את האימות לכל שם משנה של example.com (כמו foo.example.com), כל עוד קובץ assetlinks.json מתפרסם בכתובת https://example.com/.well-known/assetlinks.json:

<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>

בדיקה אם יש כמה אפליקציות שמשויכות לאותו דומיין

אם אתם מפרסמים כמה אפליקציות שמשויכות לאותו דומיין, אפשר לאמת כל אחת מהן. עם זאת, אם האפליקציות יכולות לזהות את אותו מארח דומיין ואותו נתיב, כמו במקרה של גרסאות Lite וגרסאות מלאות של אפליקציה, רק האפליקציה שהותקנה לאחרונה יכולה לזהות כוונות אינטרנט של הדומיין הזה.

במקרה כזה, כדאי לבדוק אם יש אפליקציות שמתנגשות במכשיר של המשתמש, בתנאי שיש לכם את הרשאות הגישה הנדרשות לחבילה. לאחר מכן, באפליקציה, מציגים תיבת דו-שיח מותאמת אישית לבחירה שמכילה את התוצאות מהקריאה ל-queryIntentActivities. המשתמש יכול לבחור את האפליקציה המועדפת עליו מרשימת האפליקציות התואמות שמופיעות בתיבת הדו-שיח.

תכונות של קישורים דינמיים לאפליקציות, כולל כללי התאמה מתקדמים ב-assetlinks.json והשימוש ב-<uri-relative-filter-group>, נתמכות באופן מלא רק ב-Android מגרסה 15 (רמת API‏ 35) ואילך.

ב-Android 14 (רמת API‏ 34) ומטה, המערכת מתייחסת רק ל-scheme ול-host שהוצהרו ברכיבי <data> של המניפסט לצורך אימות קישורי העומק לאפליקציה. כללים ספציפיים לנתיב, החרגות ועדכונים דינמיים מ-assetlinks.json לא חלים.

כלומר, אם במניפסט מצוינים רק scheme ו-host, יכול להיות שהאפליקציה תתעד באופן בלתי צפוי את כל הנתיבים של הדומיין המאומת ב-Android בגרסה 14 ומטה, בלי קשר לכללים הספציפיים לנתיב שמוגדרים ב-assetlinks.json ל-Android בגרסה 15 ומעלה.

כדי למנוע מהאפליקציה לטפל בכל הקישורים לדומיין ב-Android בגרסה 14 ומטה כשאתם מתכוונים להשתמש בקישורי עומק דינמיים לאפליקציה לנתיבים ספציפיים יותר ב-Android בגרסה 15 ומעלה, צריך לכלול נתיב לא תואם במסנן ה-Intent של המניפסט. מוסיפים רכיב <data> עם מאפיין android:path שלא סביר שיהיה אי פעם נתיב תקין לקישורים שלכם. כך מסנן ה-Intent לא יתאים לכל הנתיבים בגרסאות ישנות יותר.

דוגמה:

<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>

הוספת <data android:path="/no_match_for_older_android_versions" /> מבטיחה שב-Android בגרסה 14 ומטה, מסנן ה-Intent הזה לא יתאים לאף קישור נכנס, ועדיין תהיה אפשרות לאמת את הדומיין לשימוש עם קישורי עומק דינמיים לאפליקציה ב-Android בגרסה 15 ומעלה על סמך כללי ההתאמה המתקדמים בכללי assetlinks.json.

אם כבר יש לכם קישורי עומק לאפליקציה עם כללי נתיב ספציפיים (כמו android:pathPrefix) בקובץ המניפסט, ואתם רוצים להתחיל להשתמש בקישורי עומק דינמיים לאפליקציה ב-Android בגרסה 15 ואילך, אתם יכולים להוסיף את הרכיב <uri-relative-filter-group> ישירות למסנני ה-Intent הקיימים.

מכיוון שמערכת Android בגרסה 14 ומטה מתעלמת מהרכיב <uri-relative-filter-group>, קישורי העומק הקיימים לאפליקציה ממשיכים לפעול בדיוק כמו שהם פועלים עכשיו במכשירים עם גרסאות Android ישנות יותר.

עם זאת, חשוב לשים לב איך Android מגרסה 15 ואילך מעריכה את ההגדרה "מעורב":

  • סינון בשתי שכבות: ב-Android מגרסה 15 ואילך, המערכת מעריכה את מסנני ה-Intent כאיחוד. כתובת URL עוברת את בדיקת המניפסט אם היא עומדת בתנאים של תגי <data> הסטטיים הקודמים או של הכללים הרחבים בקובץ <uri-relative-filter-group>. אחרי שכתובת ה-URL עוברת את הבדיקה הראשונית הזו של המניפסט, המערכת מחילה את הכללים הדינמיים שמוגדרים בקובץ assetlinks.json כשכבה שנייה של סינון מפורט. כלומר, כללי ה-JSON בצד השרת הם אלה שקובעים בסופו של דבר אילו מכתובות ה-URL התואמות האלה באמת פותחות את האפליקציה.

דוגמה להגדרה משולבת:

<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>