אימות קישורים לאפליקציות ל-Android

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

כדי לאמת שאתם הבעלים של האפליקציה ושל כתובות ה-URL, צריך למלא את את השלבים הבאים:

  1. מוסיפים מסנני Intent שמכילים את autoVerify . המאפיין הזה מאותת למערכת שצריך לבדוק אם האפליקציה שלך שייכת לדומיינים של כתובות ה-URL שמשמשים במסנני Intent.

  2. מגדירים את השיוך בין האתר שלכם למסנני הכוונה על ידי אירוח קובץ JSON של Digital Asset Links במיקום הבא:

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

אפשר למצוא מידע רלוונטי במקורות המידע הבאים:

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

כדי להפעיל אימות של טיפול בקישורים לאפליקציה, צריך להוסיף מסנני Intent שתואמים. בפורמט הבא:

<!-- 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". -->
    <data android:scheme="http" />
    <data android:scheme="https" />

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

למרות שאפשר לכלול autoVerify רק ב<intent-filter> אחד הצהרה לכל מארח, גם אם המארח הזה משמש בשירותים אחרים שאינם מסומנים הצהרות זהות, מומלץ להוסיף autoVerify לכל אחת מההצהרות רכיב <intent-filter> לשמירה על עקביות. כך אפשר גם לוודא שאחרי מסירה או לארגן מחדש רכיבים בקובץ המניפסט, האפליקציה נשארת משויכת עם כל הדומיינים שעדיין מוגדרים.

תהליך האימות של הדומיין מחייב חיבור לאינטרנט, והוא עשוי להימשך זמן מה. כדי לשפר את יעילות התהליך אימות דומיין של אפליקציה שמטרגטת ל-Android 12 ואילך רק אם הדומיין נמצא בתוך רכיב <intent-filter> שמכיל את הפונקציה הפורמט המדויק שצוין בקטע הקוד הקודם.

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

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

הערה: ב-Android 11 (רמת API 30) ובגרסאות ישנות יותר, המערכת לא מאמתת את האפליקציה כ-handler שמוגדר כברירת מחדל, אלא אם היא מוצאת קובץ Digital Asset Links תואם לכל המארחים שהגדרתם במניפסט.

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

הערה: כל רכיבי <data> באותו מסנן Intent ממוזגים יחד כדי להביא בחשבון את כל הווריאציות של המאפיינים המשולבים. לדוגמה, מסנן הכוונה הראשון שלמעלה כולל רכיב <data> שמצהיר רק על הסכימה HTTPS. אבל הוא משולב עם הרכיב השני של <data>, כך שמסנן הכוונה תומך גם ב-http://www.example.com וגם ב-https://www.example.com. לכן, צריך ליצור מסנני Intent נפרדים כשרוצים להגדיר שילובים ספציפיים. של סכימות ודומיינים של URI.

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

פרוטוקול Digital Asset Links מתייחס לתת-דומיינים במסנני הכוונה כמארחים נפרדים וייחודיים. אז אם המטרה שלכם המסנן מפרט כמה מארחים עם תת-דומיינים שונים, צריך לפרסם assetlinks.json בכל דומיין. לדוגמה, מסנן ה-Intent הבא כולל את www.example.com ואת mobile.example.com כמארחים של כתובות URL של כוונות קבילות. לכן ערך חוקי של חובה לפרסם את 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 בשם המארח ברמה הבסיסית (root) (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(). המשתמש יכול לבחור את האפליקציה המועדפת עליו מתוך רשימת האפליקציות התואמות שמופיעות בתיבת הדו-שיח.

הצהרה על שיוכים של אתרים

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

  • package_name: מזהה האפליקציה הוצהרה בקובץ build.gradle של האפליקציה.
  • sha256_cert_fingerprints: טביעות האצבע מסוג SHA256 של אישור החתימה של האפליקציה. אפשר להשתמש בפקודה הבאה כדי ליצור את טביעת האצבע באמצעות כלי המקשים Java:
    keytool -list -v -keystore my-release-key.keystore
    
    בשדה הזה יש תמיכה בכמה טביעות אצבע, שיכולות לשמש גרסאות שונות של האפליקציה, כמו ניפוי באגים וגרסאות build לסביבת הייצור.

    אם האפליקציה שלך משתמשת בחתימת אפליקציה של Play, אז האישור טביעת אצבע שמופקת על ידי הרצה של keytool באופן מקומי בדרך כלל לא תואם לזה שמופיע מכשירים. תוכלו לוודא שאתם משתמשים האפשרות 'חתימת אפליקציה ב-Play' עבור האפליקציה בחשבון הפיתוח שלך ב-Play Console בקטע Release > Setup > App signing; אם תעשו את זה, למצוא את קטע ה-JSON הנכון של Digital Asset Links באפליקציה שלכם הדף הזה.

הקובץ assetlinks.json לדוגמה הבא מעניק הרשאות לפתיחת קישור אפליקציית com.example ל-Android:

[{
  "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"]
  }
}]

שיוך אתר לכמה אפליקציות

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

[{
  "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"]
  }
}]

אפליקציות שונות עשויות לטפל בקישורים למשאבים שונים במסגרת אותו מארח אתרי אינטרנט. לדוגמה, אפליקציה1 עשויה להצהיר על מסנן Intent עבור https://example.com/articles, ו-app2 עשויה להצהיר על מסנן מסנן Intent עבור https://example.com/videos.

הערה: יכול להיות שמספר אפליקציות שמשויכות לדומיין ייחתמו על ידי אישורים שונים.

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

כמה אתרים יכולים להצהיר על שיוכים לאותה אפליקציה assetlinks.json הקבצים המתאימים. רשימות הקבצים הבאות דוגמה לאופן שבו אפשר להצהיר על השיוך של example.com example.net עם app1. בדף האפליקציה הראשון מוצג השיוך של example.com עם 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"]
  }
}]

בדף האפליקציה הבא מוצג השיוך של example.net לאפליקציה 1. רק המיקום שבו הקבצים מתארחים לא שונה (.com ו-.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

עליכם לפרסם את קובץ האימות מסוג JSON במיקום הבא:

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

חשוב להקפיד על הפרטים הבאים:

  • הקובץ assetlinks.json מוצג עם סוג תוכן application/json.
  • הקובץ assetlinks.json חייב להיות נגיש דרך חיבור HTTPS, גם אם מסנני Intent באפליקציה שלכם מצהירים שסכימת הנתונים היא HTTPS.
  • הקובץ assetlinks.json חייב להיות נגיש ללא הפניות לכתובת אחרת (לא כתובות אתר להפניה מחדש מסוג 301 או 302).
  • אם הקישורים באפליקציה תומכים במספר דומיינים מארחים, צריך לפרסם את הקובץ assetlinks.json בכל דומיין. צפייה תמיכה בקישור אפליקציות עבור כמה מארחים.
  • אין לפרסם את האפליקציה עם כתובות URL של פיתוח/בדיקה בקובץ המניפסט שייתכן שלא להיות נגישים לציבור (למשל, אפליקציות שניתן לגשת אליהן רק באמצעות VPN). א' לעקוף במקרים כאלה הוא להגדיר build וריאנטים כדי ליצור קובץ מניפסט שונה לגרסאות build של מפתחים.

אימות קישורים לאפליקציות ל-Android

אם android:autoVerify="true" נכלל באובייקט Intent אחד לפחות של האפליקציה מסננים, התקנת האפליקציה במכשיר שמותקנת בו גרסת Android 6.0 (רמת API 23) או תגרום למערכת לאמת באופן אוטומטי את המארחים שמשויכים כתובות URL במסנני Intent של האפליקציה. ב-Android מגרסה 12 ואילך, יכול גם להפעיל את תהליך האימות באופן ידני כדי לבדוק את לוגיקת האימות.

אימות אוטומטי

האימות האוטומטי של המערכת כולל את השלבים הבאים:

  1. המערכת בודקת את כל מסנני ה-Intent שכוללים אחד מהפרטים הבאים:
    • פעולה: android.intent.action.VIEW
    • קטגוריות: android.intent.category.BROWSABLE ו-android.intent.category.DEFAULT
    • סכמת נתונים: http או https
  2. לכל שם מארח ייחודי שנמצא במסנני הכוונה שלמעלה, Android שולחת שאילתות לאתרים המתאימים לגבי קובץ Digital Asset Links בכתובת https://hostname/.well-known/assetlinks.json.

אחרי שתאשרו את רשימת האתרים לשיוך לאפליקציה שלכם, וגם וידאת שקובץ JSON המתארח חוקי, יש להתקין את האפליקציה במכשיר. יש להמתין 20 שניות לפחות עד שתהליך האימות האסינכרוני יסתיים הושלם. השתמש בפקודה הבאה כדי לבדוק אם המערכת אימתה את באפליקציה ולהגדיר את המדיניות הנכונה לטיפול בקישורים:

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

אימות ידני

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

חיבור לאינטרנט

כדי לבצע אימות דומיין, מכשיר הבדיקה צריך להיות מחובר אל באינטרנט.

תמיכה בתהליך המעודכן של אימות הדומיין

אם האפליקציה מטרגטת את Android 12 ואילך, המערכת תשתמש ב- את התהליך המעודכן של אימות הדומיין באופן אוטומטי.

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

adb shell am compat enable 175408749 PACKAGE_NAME

איך מאפסים את מצב הקישורים לאפליקציות ל-Android במכשיר

לפני שמפעילים באופן ידני את אימות הדומיין במכשיר, צריך לאפס את המצב של Android App Links במכשיר הבדיקה. כדי לעשות את זה, מריצים את הפקודה הבאה: הפקודה בחלון הטרמינל:

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

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

הפעלה של תהליך אימות הדומיין

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

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

בודקים את תוצאות האימות

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

adb shell pm get-app-links PACKAGE_NAME

הפלט של הפקודה הזו אמור להיראות כך:

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

לדומיינים שעברו את האימות בהצלחה יש מצב של אימות דומיין מתוך verified. כל מצב אחר מציין שאימות הדומיין לא הצליח לבצע. באופן ספציפי, מצב של none מצביע על כך שהאימות יכול להיות שהנציג עדיין לא השלים את תהליך האימות.

ברשימה הבאה מפורטים הערכים האפשריים להחזרה שאימות הדומיין יכול החזרה עבור דומיין נתון:

none
לא נרשם דבר לגבי הדומיין הזה. מחכים עוד כמה דקות עד של סוכן האימות כדי לסיים את הבקשות הקשורות לאימות דומיין, ולאחר מכן להפעיל מחדש את תהליך אימות הדומיין.
verified
הדומיין אומת בהצלחה לאפליקציה המוצהרת.
approved
הדומיין אושר לפי הגדרת האדמין, בדרך כלל על ידי הרצה של פקודת מעטפת.
denied
הדומיין נדחה בכוח, בדרך כלל על ידי הפעלת פקודת מעטפת.
migrated
המערכת שמרה את התוצאה של תהליך קודם שבו נעשה שימוש בדומיין מדור קודם אימות.
restored
הדומיין אושר אחרי שהמשתמש ביצע שחזור נתונים. ההנחה היא שהדומיין אומת בעבר.
legacy_failure
הדומיין נדחה על ידי מאמת מדור קודם. הסיבה הספציפית לכשל היא לא ידועה.
system_configured
הדומיין אושר באופן אוטומטי על ידי הגדרת המכשיר.
קוד שגיאה 1024 ומעלה

קוד שגיאה בהתאמה אישית שהוא ספציפי למאמת של המכשיר.

מוודאים שיצרתם חיבור לרשת ומפעילים שוב את תהליך האימות של הדומיין.

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

דרך נוספת לאשר את האפליקציה לדומיין היא לבקש מהמשתמש לשייך את האפליקציה לדומיין הזה.

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

לפני שמבקשים מהמשתמשים, צריך לבדוק אם האפליקציה היא ה-handler שמוגדר כברירת מחדל הדומיינים שהגדרת ברכיבי <intent-filter>. אפשר לשלוח שאילתה לגבי מצב האישור באמצעות אחת מהשיטות הבאות:

DomainVerifyManager (מנהל אימות)

קטע הקוד הבא מדגים איך להשתמש DomainVerificationManager API:

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);
    }
}

תוכנת שורת הפקודה

כשבודקים את האפליקציה במהלך הפיתוח, אפשר להריץ את הפקודה הבאה כדי: שולחים שאילתה על מצב האימות של הדומיינים שבבעלות הארגון שלכם:

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

בפלט של הדוגמה הבאה, למרות שהאימות של האפליקציה נכשל example.org דומיין, משתמש 0 אישר את האפליקציה באופן ידני בהגדרות המערכת, ואף חבילה אחרת לא מאומתת עבור הדומיין הזה.

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

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

מתן הקשר לבקשה

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

שליחת הבקשה

אחרי שהמשתמשים יבינו מה האפליקציה מבקשת מהם לעשות, שלחו את הבקשה. כדי לעשות את זה, מפעילים כוונה שכוללת את ACTION_APP_OPEN_BY_DEFAULT_SETTINGS Intent ומחרוזת נתונים, package:com.example.pkg לאפליקציית היעד, כפי שמוצג ב: את קטע הקוד הבא:

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

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

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

כשלחצן הבחירה מופעל, הקטע בחלק התחתון
    כולל תיבות סימון וגם לחצן בשם &#39;הוספת קישור&#39;
איור 1. מסך הגדרות המערכת שבו המשתמשים יכולים לבחור אילו קישורים ייפתח באפליקציה כברירת מחדל.
כל תיבת סימון מייצגת דומיין שאפשר להוסיף. 
    הלחצנים בתיבת הדו-שיח הם &#39;ביטול&#39; ו&#39;הוספה&#39;.
איור 2. תיבת דו-שיח שבה המשתמשים יכולים לבחור דומיינים נוספים שרוצים לשייך לאפליקציה.

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

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

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

בדיקת קישורים לאפליקציות

כשמטמיעים את תכונת קישור האפליקציות, כדאי לבדוק את פונקציונליות הקישור כדי עליך לוודא שהמערכת יכולה לשייך את האפליקציה לאתרים שלך ולטפל בבקשות לכתובות URL, כמצופה.

כדי לבדוק קובץ דף חשבון קיים אפשר להשתמש הכלי 'יצירת רשימות סיכום' ו'בודק'.

אישור רשימת המארחים לאימות

במהלך הבדיקה, צריך לאשר את רשימת המארחים המשויכים שהמערכת צריכה לאמת עבור האפליקציה. צריך ליצור רשימה של כל כתובות ה-URL שמסנני הכוונה התואמים שלהן כוללים את המאפיינים והרכיבים הבאים:

  • מאפיין android:scheme עם הערך http או https
  • מאפיין android:host עם דפוס כתובת URL של דומיין
  • רכיב פעולה אחד (android.intent.action.VIEW)
  • רכיב קטגוריה אחד (android.intent.category.BROWSABLE)

הרשימה הזו מאפשרת לבדוק שכל מארח בעל שם מספק קובץ JSON עם Digital Asset Links ותת-דומיין.

מאשרים את קובצי ה-Digital Asset Links

בכל אתר, משתמשים ב-Digital Asset Links API כדי לוודא שקובץ ה-JSON של Digital Asset Links מתארח ומוגדר בצורה תקינה:

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

כחלק מתהליך הבדיקה, אפשר לבדוק את הגדרות המערכת הנוכחיות לטיפול בקישורים. השתמשו בפקודה הבאה כדי לקבל רשימה של כללי מדיניות הטיפול בקישורים שקיימים עבור כל אפליקציות במכשיר המחובר:

adb shell dumpsys package domain-preferred-apps

אפשרות אחרת היא הפעולה הבאה:

adb shell dumpsys package d

הערה: אחרי התקנת האפליקציה, חשוב להמתין לפחות 20 שניות כדי לאפשר למערכת להשלים את תהליך האימות.

הפקודה מחזירה רשימה של כל משתמש או פרופיל שמוגדרים במכשיר, לפניה כותרת בפורמט הבא:

App linkages for user 0:

לאחר הכותרת הזו, הפלט משתמש בפורמט הבא כדי להציג את רשימת ההגדרות של טיפול בקישורים למשתמש הזה:

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

דף האפליקציה הזה מציין אילו אפליקציות משויכות לאילו דומיינים של המשתמש:

  • Package – מזהה אפליקציה לפי שם החבילה שלה, כפי שהוצהר במניפסט.
  • Domains – מציג את הרשימה המלאה של המארחים שהאפליקציה הזו מטפלת בהם באמצעות קישורי האינטרנט, באמצעות רווחים ריקים כמפרידים.
  • Status - מציג את ההגדרה הנוכחית של טיפול בקישורים עבור האפליקציה הזו. אפליקציה שכוללת עבר אימות, והמניפסט שלו מכיל android:autoVerify="true", מוצג סטטוס מתוך always. המספר ההקסאדצימלי שמופיע אחרי הסטטוס הזה קשור לרשומות של מערכת Android לגבי העדפות הקישור של המשתמש לאפליקציות. הערך הזה לא מציין אם אימות הצליחה.

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

דוגמה לבדיקה

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

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

רשימת המארחים שהפלטפורמה תנסה לאמת מהמניפסט שלמעלה:

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

רשימת המארחים שהפלטפורמה לא תנסה לאמת מהמניפסט שלמעלה:

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

מידע נוסף על רשימות של דוחות זמין בכתובת יצירת רשימה של דפי חשבון.

תיקון של שגיאות נפוצות בהטמעה

אם לא מצליחים לאמת את הקישורים לאפליקציות ל-Android, כדאי לבדוק את הדברים הבאים שגיאות. הקטע הזה משתמש ב-example.com כשם דומיין כ-placeholder. מתי כשמבצעים את הבדיקות האלה, מחליפים את example.com בקובץ שם דומיין.

הגדרה שגויה של מסנן Intent
בודקים אם כלולה רכיב <intent-filter> שכתובת ה-URL שלו לא בבעלות האפליקציה.
הגדרת שרת שגויה

צריך לבדוק את הגדרות ה-JSON של השרת ולוודא שערך ה-SHA נכון.

בנוסף, צריך לוודא שההגשה של example.com. (עם הנקודה האחרונה) זהה תוכן בתור example.com.

הפניות אוטומטיות בצד השרת

אם הגדרת את האפליקציה, המערכת לא מאמתת אף קישור לאפליקציות ל-Android הפניה לכתובת אחרת, כמו:

  • http://example.com עד https://example.com
  • example.com עד www.example.com

ההתנהגות הזו מגנה על אבטחת האפליקציה.

חוסן שרת

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

קישורים שלא ניתן לאמת

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

חתימה שגויה ב-Assetlinks.json

יש לוודא שהחתימה שלך נכונה ותואמת לחתימה שמשמשת לחתימה באפליקציה שלך. דוגמאות לשגיאות נפוצות:

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