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

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

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

פרוטוקול Digital Asset Links מתייחס לתת-דומיינים במסנני 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 בשם המארח ברמה הבסיסית (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. לגבי כל שם מארח ייחודי שנמצא במסנני Intent שלמעלה, שאילתות 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 במכשיר הבדיקה. כדי לעשות את זה, מריצים את הפקודה הבאה: הפקודה בחלון הטרמינל:

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.

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

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

יצירת הבקשה

אחרי שהמשתמשים יבינו מה האפליקציה מבקשת מהם לעשות, שלחו את הבקשה. כדי לעשות את זה, מפעילים כוונה שכוללת את 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);

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

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

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

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

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

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

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

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

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

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

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

  • מאפיין 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. המספר ההקסדצימלי אחרי הסטטוס הזה קשור למספר ההקסדצימלי רשומה של העדפות המשתמש לקישור אפליקציות. הערך הזה לא מציין אם אימות הצליחה.

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

דוגמה לבדיקה

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

<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
בודקים אם ציינתם בכתובת URL כתובת URL שלא נמצאת בבעלות האפליקציה שלכם רכיב <intent-filter>.
הגדרת שרת שגויה

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