驗證 Android 應用程式連結

Android 應用程式連結是一種特殊類型的深層連結,可讓網站網址立即開啟 Android 應用程式中的對應內容,而不必要求使用者選取應用程式。Android 應用程式連結會使用 Digital Asset Links API 來建立信任,代表網站已核准自動開啟該網域的連結。如果系統成功驗證您是否擁有網址,系統就會自動將這些網址意圖轉送至應用程式。

如要驗證您同時擁有應用程式和網站網址,請完成下列步驟:

  1. 新增意圖篩選器,其中包含 autoVerify 屬性。此屬性會向系統表明您的應用程式是否屬於意圖篩選器使用的網址網域。

  2. 在下列位置託管 Digital Asset Links JSON 檔案,以宣告網站和意圖篩選器之間的關聯

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

您可以在下列資源中找到相關資訊:

新增應用程式連結驗證的意圖篩選器

如要為應用程式啟用連結處理驗證功能,請新增符合下列格式的意圖篩選器:

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

雖然每個主機在一個 <intent-filter> 宣告中只收錄 autoVerify 就夠用了,即使該主機被用於其他未標示的宣告中,我們仍建議您在每個 <intent-filter> 元素中新增 autoVerify,以保持一致性。這樣也可以確保在資訊清單檔案中移除或重構元素後,應用程式會與仍然定義的所有網域建立關聯。

網域驗證程序需要網際網路連線,因此可能需要一些時間才能完成。為協助改善程序的效率,只有在網域位於指定 Android 12 以上版本為目標的 <intent-filter> 元素內時,系統才會驗證其網域,且該元素需完全符合上述程式碼片段中指定的格式。

支援多個主機的應用程式連結

系統必須能夠針對應用程式網址意圖篩選器的資料元素,驗證應用程式網址意圖篩選器資料元素中指定的主機,然後比對該意圖篩選器中相應網域上代管的 Digital Asset Links 檔案。如果驗證失敗,系統會預設採用標準行為來解析意圖,如「建立應用程式內容的深層連結」一文所述。不過,針對應用程式其他意圖篩選器中定義的任何網址模式,應用程式仍可通過驗證做為預設處理常式。

注意:在 Android 11 (API 級別 30) 以下版本中,除非在資訊清單中定義的「所有」主機找到相符的 Digital Asset Links 檔案,否則系統不會驗證您的應用程式為預設處理常式。

舉例來說,如果應用程式在 https://www.example.com/.well-known/assetlinks.json 找到 assetlinks.json 檔案,但不在 https://www.example.net/.well-known/assetlinks.json,則採用下列意圖篩選器的應用程式只會通過 https://www.example.com 的驗證:

<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> 元素會合併在一起,以因應合併屬性的所有變化版本。例如,上述第一個意圖篩選器包含只會宣告 HTTPS 配置的 <data> 元素。不過,此做法會與其他 <data> 元素結合,因此意圖篩選器同時支援 http://www.example.comhttps://www.example.com。因此,若要定義特定 URI 配置和網域組合,您必須建立不同的意圖篩選器。

支援多個子網域的應用程式連結

Digital Asset Links 通訊協定會將意圖篩選器中的子網域視為不重複的獨立主機。因此,如果您的意圖篩選器列出多個擁有不同子網域的主機,您必須在每個網域上發布有效的 assetlinks.json。舉例來說,以下意圖篩選器包含 www.example.commobile.example.com 做為可接受的意圖網址主機。因此,有效的 assetlinks.json 必須同時在 https://www.example.com/.well-known/assetlinks.jsonhttps://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) 宣告主機名稱,則必須在根主機名稱 (example.com) 發布 assetlinks.json 檔案。舉例來說,具有以下意圖篩選器的應用程式將通過任何 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>

檢查是否有多個與同一網域相關聯的應用程式

如果您發布了多個應用程式,而每個應用程式都與同一個網域建立關聯,則每個應用程式都能成功通過驗證。不過,如果應用程式可以解析相同的網域代管商和路徑 (如同應用程式精簡版和完整版),則只有最近安裝的應用程式才能解析該網域的網路意圖。

在這種情況下,如果擁有必要的套件瀏覽權限,請檢查使用者裝置上的應用程式是否存在衝突。然後,在應用程式中顯示自訂選擇器對話方塊,其中包含呼叫 queryIntentActivities() 的結果。使用者可以從對話方塊中顯示的相符應用程式清單中選取偏好的應用程式。

宣告網站關聯

您必須在網站上發布 Digital Asset Links JSON 檔案,才能指出與網站相關聯的 Android 應用程式,並驗證應用程式的網址意圖。JSON 檔案會使用下列欄位來識別相關聯的應用程式:

  • package_name:應用程式的 build.gradle 檔案中宣告的應用程式 ID
  • sha256_cert_fingerprints:應用程式簽署憑證的 SHA256 指紋。您可以使用下列指令,透過 Java keytool 產生指紋:
    keytool -list -v -keystore my-release-key.keystore
    
    這個欄位支援多個指紋,可用來支援應用程式的不同版本,例如偵錯和正式版。

    如果您的應用程式使用 Play 應用程式簽署功能,則在本機執行 keytool 產生的憑證指紋通常與使用者裝置上的憑證不符。您可以前往 Play 管理中心的開發人員帳戶,確認您是否在 Release > Setup > App signing 下為應用程式使用 Play 應用程式簽署功能。這樣一來,您也可以在相同頁面找到應用程式的正確 Digital Asset Links JSON 程式碼片段。

以下 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"]
  }
}]

不同的應用程式可能會處理同一個網站代管商中不同資源的連結。舉例來說,app1 可能為 https://example.com/articles 宣告意圖篩選器,而 app2 可為 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 與 app1 的關聯。只有這些檔案的代管位置 (.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 提供。
  • 無論應用程式的意圖篩選器是否將 HTTPS 宣告為資料配置,assetlinks.json 檔案都必須透過 HTTPS 連線存取。
  • assetlinks.json 檔案必須可在沒有任何重新導向的情況下存取 (不得使用 301 或 302 重新導向)。
  • 如果您的應用程式連結支援多個代管網域,您必須在每個網域上發布 assetlinks.json 檔案。請參閱「支援使用多個主機的應用程式連結」。
  • 請勿在資訊清單檔案中發布開發/測試網址,且使用者可能無法公開存取該應用程式,例如只能透過 VPN 存取的任何網址。這種情況的一個解決方法是設定建構變數,為開發版本產生不同的資訊清單檔案。

Android 應用程式連結驗證

如果 android:autoVerify="true" 存在於至少一個應用程式的意圖篩選器中,則在搭載 Android 6.0 (API 級別 23) 以上版本的裝置上安裝應用程式,會導致系統自動驗證與應用程式意圖篩選器中的網址相關聯的主機。在 Android 12 以上版本中,您也可以手動叫用驗證程序來測試驗證邏輯。

自動驗證

系統的自動驗證程序包括:

  1. 系統會檢查含有以下任一項目的所有意圖篩選器:
    • 操作:android.intent.action.VIEW
    • 類別:android.intent.category.BROWSABLEandroid.intent.category.DEFAULT
    • 資料配置:httphttps
  2. 針對在上述意圖篩選器中找到的每個不重複主機名稱,Android 會查詢 https://hostname/.well-known/assetlinks.json 中 Digital Asset Links 檔案的對應網站。

確認要與應用程式建立關聯的網站清單,並確認代管的 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 以上

裝置驗證器專屬的自訂錯誤代碼。

請再次確認您已建立網路連線,並再次叫用網域驗證程序

要求使用者將應用程式與網域建立關聯

如要讓應用程式獲準使用網域,另一種方法是要求使用者將應用程式與該網域建立關聯。

確認網域是否已核准適用於網域

提示使用者之前,請先檢查您的應用程式是否為您在 <intent-filter> 元素中定義的網域的預設處理常式。您可以使用下列其中一種方法查詢核准狀態:

網域驗證管理員

下列程式碼片段展示如何使用 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 的輸出內容取得。

提供要求背景資訊

在您提出網域核准要求之前,請先為使用者提供一些背景資訊。舉例來說,您可以向使用者顯示啟動畫面、對話方塊或類似的 UI 元素,向使用者說明為什麼您的應用程式應為特定網域的預設處理常式。

提出要求

使用者瞭解應用程式要求執行的操作後,請提出要求。方法是叫用包含ACTION_APP_OPEN_BY_DEFAULT_SETTINGS意圖動作,以及與目標應用程式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);

叫用意圖時,使用者會看到名為「預設為開啟」的設定畫面。此畫麵包含一個名為「Open supported links」的圓形按鈕,如圖 1 所示。

使用者開啟「開啟支援的連結」後,「要在這個應用程式中開啟的連結」部分下方會顯示一組核取方塊。使用者在這裡可以選取要與應用程式建立關聯的網域。他們也可以選取「Add link」來新增網域,如圖 2 所示。當使用者之後選取自己新增網域中的任何連結時,該連結會自動在應用程式中開啟。

啟用圓形按鈕後,畫面底部附近的部分包含核取方塊和「新增連結」按鈕
圖 1.系統設定畫面,可讓使用者選擇要在應用程式中預設開啟的連結。
每個核取方塊都代表可新增的網域。對話方塊中的按鈕為「Cancel」和「Add」。
圖 2.這個對話方塊可讓使用者選擇要與應用程式建立關聯的其他網域。

在應用程式中開啟應用程式無法驗證的網域

您應用程式的主要功能可能是以第三方身分開啟連結,但無法驗證其處理的網域。在這種情況下,請向使用者說明,當他們選取網頁連結時,無法在第三方應用程式和您的第三方應用程式之間選擇。使用者必須手動將網域與第三方應用程式建立關聯。

此外,建議您導入對話方塊或 Trampoline 活動,讓使用者視需要在第一方應用程式中開啟連結,並以 Proxy 的形式運作。設定這類對話方塊或 Trampoline 活動前,請先設定您的應用程式,使其套件瀏覽權限符合應用程式網路意圖篩選器的第一方應用程式。

測試應用程式連結

實作應用程式連結功能時,建議您測試連結功能,確認系統能夠將您的應用程式與網站建立關聯,並按預期處理網址要求。

如要測試現有的陳述式檔案,您可以使用 陳述式清單產生器和測試工具工具。

確認要驗證的主機清單

測試時,您應確認系統應為應用程式驗證的相關主機清單。請列出具有對應意圖篩選器的所有網址,其對應意圖篩選器包含下列屬性和元素:

  • 值為 httphttpsandroid:scheme 屬性
  • 含有網域網址模式的 android:host 屬性
  • android.intent.action.VIEW 動作元素
  • android.intent.category.BROWSABLE 類別元素

請使用這份清單,檢查每個已命名的主機和子網域上是否已提供 Digital Asset Links JSON 檔案。

確認 Digital Asset Links 檔案

針對每個網站,使用 Digital Asset Links API 確認 Digital Asset Links JSON 檔案已正確託管及定義:

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 做為預留位置網域名稱。執行這些檢查時,請將 example.com 替換成伺服器的實際網域名稱。

意圖篩選器設定不正確
檢查 <intent-filter> 元素中是否加入應用程式未擁有的網址。
伺服器設定不正確

檢查伺服器的 JSON 設定,確認 SHA 值正確無誤。

此外,請確認 example.com. (附帶結尾句號) 提供與 example.com 相同的內容。

伺服器端重新導向

如果您設定下列重新導向,系統就不會驗證應用程式的「任何」Android 應用程式連結:

  • http://example.comhttps://example.com
  • example.comwww.example.com

這項行為可以保護應用程式的安全。

伺服器穩定性

檢查伺服器能否連接至用戶端應用程式。

不可驗證的連結

為了進行測試,您可以刻意新增無法驗證的連結。請注意,在 Android 11 以下版本中,這些連結會導致系統不會驗證應用程式的「所有」Android 應用程式連結。

assetlinks.json 中的簽名不正確

確認簽名正確無誤,且與用於簽署應用程式的簽章相符。常見錯誤包括:

  • 使用偵錯憑證簽署應用程式,並在 assetlinks.json 中只擁有發布簽章。
  • assetlinks.json 中使用小寫的簽名。簽章應為大寫。
  • 如果您使用 Play 應用程式簽署功能,請務必使用 Google 用來簽署每個版本的簽章。您可以按照宣告網站關聯的操作說明,驗證這些詳細資料 (包括完整的 JSON 程式碼片段)。