深度連結(deep linking)是一種使用 URI 啟動應用程式的機制。 這個 URI 包含 scheme、host 和 path, 並可直接開啟應用程式至特定螢幕。

App link(App 連結) 是一種深層連結(deep link), 它使用 httphttps,且僅限於 Android 裝置。

設定 App 連結需要擁有一個網域名稱。 否則,可以考慮暫時使用 Firebase HostingGitHub Pages 作為解決方案。

當你完成深層連結(deep links)的設定後,可以進行驗證。 如需進一步了解,請參閱 驗證深層連結

1. 自訂 Flutter 應用程式

#

撰寫一個能夠處理傳入 URL 的 Flutter 應用程式。 本範例使用 go_router 套件來處理路由。 Flutter 團隊維護 go_router 套件, 它提供簡單的 API 來處理複雜的路由情境。

  1. 若要建立新應用程式,請輸入 flutter create <app-name>

    flutter create deeplink_cookbook
  2. 若要在您的應用程式中加入 go_router 套件, 請在專案中新增 go_router 的相依性:

    若要將 go_router 套件作為相依性加入, 請執行 flutter pub add

    flutter pub add go_router
  3. 若要處理路由, 請在main.dart檔案中建立GoRouter物件:

    main.dart
    dart
    import 'package:flutter/material.dart';
    import 'package:go_router/go_router.dart';
    
    void main() => runApp(MaterialApp.router(routerConfig: router));
    
    /// This handles '/' and '/details'.
    final router = GoRouter(
      routes: [
        GoRoute(
          path: '/',
          builder: (_, _) => Scaffold(
            appBar: AppBar(title: const Text('Home Screen')),
          ),
          routes: [
            GoRoute(
              path: 'details',
              builder: (_, _) => Scaffold(
                appBar: AppBar(title: const Text('Details Screen')),
              ),
            ),
          ],
        ),
      ],
    );

2. 修改 AndroidManifest.xml

#
  1. 使用 VS Code 或 Android Studio 開啟 Flutter 專案。

  2. 導航至 android/app/src/main/AndroidManifest.xml 檔案。

  3. <activity> 標籤內,並搭配 .MainActivity,加入以下 metadata 標籤與 intent filter。

    請將 example.com 替換為你自己的網域名稱。

    xml
    <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" android:host="example.com" />
        <data android:scheme="https" />
    </intent-filter>
#

使用你擁有的網域,透過網頁伺服器託管 assetlinks.json 檔案。這個檔案會告訴行動瀏覽器,應該開啟哪一個 Android 應用程式,而不是直接在瀏覽器中開啟。要建立這個檔案,請取得你在前一步建立的 Flutter 應用程式的套件名稱(package name),以及你將用來建置 APK 的簽署金鑰(signing key)的 sha256 指紋。

套件名稱(Package name)

#

AndroidManifest.xml 中找到套件名稱,位於 <manifest> 標籤下的 package 屬性。套件名稱通常的格式為 com.example.*

sha256 指紋

#

根據 APK 的簽署方式,取得 sha256 指紋的流程會有所不同。

使用 Google Play 應用程式簽署(Google Play app signing)

#

你可以直接在 Play 開發人員主控台(Play Developer Console)中找到 sha256 指紋。開啟你的應用程式,在 Release > Setup > App Integrity > App Signing 分頁下:

Screenshot of sha256 fingerprint in play developer console

使用本地 keystore

#

如果你是將金鑰儲存在本地,可以使用以下指令產生 sha256 指紋:

keytool -list -v -keystore <path-to-keystore>
#

託管的檔案應該類似如下所示:

json
[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example.deeplink_cookbook",
    "sha256_cert_fingerprints":
    ["FF:2A:CF:7B:DD:CC:F1:03:3E:E8:B2:27:7C:A2:E3:3C:DE:13:DB:AC:8E:EB:3A:B9:72:A1:0E:26:8A:F5:EC:AF"]
  }
}]
  1. package_name 設定為你的 Android 應用程式 ID。

  2. 將 sha256_cert_fingerprints 設定為你在前一步取得的值。

  3. 將檔案託管在類似以下格式的 URL 上: <webdomain>/.well-known/assetlinks.json

  4. 確認你的瀏覽器可以存取這個檔案。

測試

#

你可以使用實體裝置或模擬器(Emulator)來測試 app link, 但請先確保你已在裝置上至少執行過一次 flutter run。 這可確保 Flutter 應用程式已安裝。

Emulator screenshot

若只需測試應用程式的設定,可使用 adb 指令:

adb shell 'am start -a android.intent.action.VIEW \
    -c android.intent.category.BROWSABLE \
    -d "http://<web-domain>/details"' \
    <package name>

若要同時測試網頁與應用程式的設定,必須直接透過網頁瀏覽器或其他應用程式點擊連結。 其中一種方式是建立一份 Google 文件,加入該連結,然後點擊它。

如果一切設定正確,Flutter 應用程式會啟動並顯示詳細資訊螢幕:

Deeplinked Emulator screenshot

附錄

#

原始碼:deeplink_cookbook