深度連結是一種透過 URI 啟動應用程式的機制。此 URI 包含方案、主機和路徑,並開啟應用程式到特定螢幕。

“應用連結”是一種深度連結,它使用 httphttps,並且僅適用於 Android 裝置。

設定應用連結需要擁有一個 Web 域名。否則,請考慮使用 Firebase HostingGitHub Pages 作為臨時解決方案。

設定深度連結後,可以對其進行驗證。要了解更多資訊,請參閱驗證深度連結

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. 在帶有 .MainActivity<activity> 標籤內新增以下元資料標籤和 intent 過濾器。

    example.com 替換為您自己的 Web 域名。

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

使用您擁有的域名的 Web 伺服器託管 assetlinks.json 檔案。此檔案告訴移動瀏覽器要開啟哪個 Android 應用程式,而不是瀏覽器。要建立該檔案,請獲取您在上一步中建立的 Flutter 應用程式的包名以及您將用於構建 APK 的簽名金鑰的 sha256 指紋。

包名

#

AndroidManifest.xml 中的 <manifest> 標籤下的 package 屬性中找到包名。包名通常採用 com.example.* 格式。

sha256 指紋

#

此過程可能因 apk 的簽名方式而異。

使用 Google Play 應用簽名

#

您可以直接從 Play 開發者控制檯找到 sha256 指紋。在 Play 控制檯中開啟您的應用,在 釋出 > 設定 > 應用完整性 > 應用簽名 標籤下。

Screenshot of sha256 fingerprint in play developer console

使用本地金鑰庫

#

如果將金鑰儲存在本地,可以使用以下命令生成 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. 驗證您的瀏覽器是否可以訪問此檔案。

測試

#

您可以使用真實裝置或模擬器來測試應用連結,但首先請確保您已在裝置上至少執行過一次 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>

要測試 Web 和應用設定,必須直接透過 Web 瀏覽器或另一個應用點選連結。一種方法是建立 Google 文件,新增連結,然後點選它。

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

Deeplinked Emulator screenshot

附錄

#

原始碼:deeplink_cookbook