Flutter 實作 DeepLink 完整指南 ⎮ Part 3: Flutter 開發
不可忽視的 Deep Link 體驗
Flutter Development
如果你的專案是使用 Navigator 進行頁面的 Route 處理,而不是 Navigator 2 或者 GoRouter、auto_route 等等新式解決方案,在處理連結上會稍嫌麻煩。我們一起從最基礎的 Navigator 了解,實際上根據需求去管理導航就好,不必遵守某一套特定做法。提供了以下的範例跟大家分享
通常要捕捉設置的 Links,可以使用 app_links 套件協助我們。
它有提供了幾個精簡的 API 方便開發,其中包含:
getInitialAppLink()
uriLinkStream
allUriLinkStream
getInitialAppLink()
取得 APP 初始連結,也就是被系統捕捉到但還沒處理的連結。必須存在的 API,因為當應用程式處於 cold state 也就是 terminated(終止)的時候使用者可能會點擊到連結,就需要這個 callback 的觸發,在開啟 APP 後能做一些反應。例如:跳轉到指定頁面、儲存資料。
final initialAppLinkUri = await _appLinks.getInitialAppLink();
if (initialAppLinkUri != null) {
handleDeepLink(initialAppLinkUri);
}
uriLinkStream
當 APP 開啟時 (在背景和前景) 使用者點擊連結,uriLinkStream 會提供事件,包含 uri
資料,讓我們做後續處理。
_appLinks.uriLinkStream.listen(
(uri) {
handleDeepLink(uri);
},
);
allUriLinkStream
APP 在任何的狀態下都能捕捉到連結,包含 getInitialAppLink()
和 uriLinkStream
的功用。在大部分情境下,可以只選擇使用它就好
_appLinks.allUriLinkStream.listen(
(uri) {
handleDeepLink(uri);
},
);
根據場景需求,通常捕捉 Deep Link 為兩種實作方式:
getInitialAppLink()
+uriLinkStream
allUriLinkStream
避免三種都使用,否則同一個連結事件,可能會造成重複處理的狀況
在監聽到 Deep Link 觸發之後,可以檢查 URI 是否為我們設置的格式,將內容提取出來使用。可能有多個連結,可以進行個別處理。
void handleDeepLink(Uri? uri) {
if (uri == null) {
return;
}
final uriHost = uri.host;
final uriPath = uri.path;
// if (uriOrigin.contains(StringConstants.deepLinkDomainVibzCool) &&
// uriPath.contains(StringConstants.deepLinkPathUsers)) {
if (uriHost == 'yii.cool') {
final userName = uriPath.split('/').elementAtOrNull(1);
if (userName == null) {
return;
}
// Navigate to specific page
...
}
if (uriHost == 'share.yii.cool') {
if (uriPath.contains('/product')) {
final productName = uriPath.split('/').elementAtOrNull(2);
if (productName == null) {
return;
}
// Navigate to specific page
...
}
}
}
Test and Check
實作完成後,我們會需要透過完整的測試來驗證所設定的 Deep Link,確保在各種情境下能夠順利運行,提供好的用戶體驗。
- 多情境測試
在多種目標平台與社交平台上測試,例如 Web、Social Platform(Instagram, Facebook)、Line、Slack 等,點擊連結來確認完整性。另外包含應用在背景和前景下的狀況,嚴謹地確認用戶能透過連結打開 APP 並跳轉到指定頁面。
2. DevTools Deeplinking Web Validator
在 Flutter 3.19,支援 Android 上的 Web 檢查,驗證資源檔案 assetlinks.json
。開發人員可以開啟 DevTools,點擊進入 Deep Links 選項,然後匯入包含深層連結的 Flutter 專案,Validator 會告訴我們 Web 檔案是否配置正確。
Simulator Testing
當在電腦運行模擬器時,可以透過 Terminal 輸入命令驗證 Deep Link 是否有效。
Android 指令:
adb shell am start -a android.intent.action.VIEW \\
-c android.intent.category.BROWSABLE \\
-d "<https://vibz.cool/test555>"
# simple
adb shell am start "<https://vibz.cool/test555>"
# 跳過數位資產連結的驗證步驟,提早測試
adb shell am start -d "<https://www.airbnb.co.uk/rooms/12275365>"
adb shell am start -d "vibz://vibz.cool/test7733"
取得應用驗證後的結果
adb shell pm get-app-links com.yiichen.test
iOS 指令:
// Web Link
xcrun simctl openurl booted <https://vibz.cool/test555>
// Custom Link
xcrun simctl openurl booted vibz://vibz.cool/test555
需確保 scheme、host、path,與
AndroidManifest.xml
、Info.plist
中設置的都相同
Deep Linking Validator
存在於 Devtools Deep Links 分頁,幫助開發者了解哪些連結的配置不正確,透過狀態快速了解情況。
載入 Flutter 專案後,在列表可清楚知道哪些連結的設定是正確的,哪些是有問題的。可查看資訊包括:
- 連結的相關路徑
- Scheme 格式
- OS 作業系統
- 配置狀態,成功與否
Deep Link 設定錯誤通常會有幾種原因,URL 格式錯誤、Manifest 檔案設定錯誤、Digital Asset 沒有放置,或是內容不完整。
有關數位資源內容錯誤的情境可看下方截圖:
請大家善用 Deep Link Validator,所有的情況它都能幫我們快速的確認,在開發上是一個很棒的工具。不需要再手動花費多餘的時間囉~
目前僅支援驗證 Android 連結的配置,iOS 開發中 (May. 2024)
實際問題
Android Deep Link 啟動
Android 在 Deep Link 運作時,如果 APP 是完全關閉且未開啟的狀態,有可能會導致啟動時畫面卡住,無法正常運行。原因是,專案的 Routes 設置,Deep Link 需要有 /
路徑名稱的頁面,通常都是首頁,就跟網頁一樣。而我遇到的問題就是因為 APP Route 沒有 /
,初始頁面為自定義名稱,導致 Deep Link 執行第一次啟動時沒有入口可以進入。
這個問題沒有很多 log meassge 可以參考,使用 print()
也沒用,較難 Debug。以下是發現的錯誤訊息:
但只要 APP 已經有事先啟動過的狀況,就能夠正常跳轉到指定頁面。正常運行,是因為不需要走初始流程,也不需要 /
route 的開啟。
請確保 APP Routing 設定有按照正常實作方式去撰寫,擁有
/
路徑
Conclusion
在本文中我們了解基本的 DeepLink 捕捉方式,在沒有使用其他 Routing 套件的情境中,掌握每個以配置的連結和路徑,準確跳轉到指定頁面。另外也分享了使用 Deep Linking Validator 的好處,如何有效檢測配置以及正確性,是對開發者來說一個開發的好助手。
接下來一起期待 2024 年尾能推出 iOS 支援的 Validator,到時候 Flutter 開發生態就更完整了!
瀏覽其他章節:
Other Articles
- Flutter September 2024 💙 Flutter Monthly
- Flutter August 2024 💙 Flutter Monthly
- Flutter June 2024 💙 Flutter Monthly
- What can I do with “Extension Types” in Dart?
- Flutter May 2024 💙 Flutter Monthly
- Flutter April 2024 💙 Flutter Monthly
- Flutter March 2024 💙 Flutter Monthly
- Flutter February 2024 💙 Flutter Monthly
- Flutter 3.19 & Dart 3.3 改版重點!
- Flutter January 2024 💙 Flutter Monthly
- Use Dart 3 to Improve Development Skills. More Examples and Tips.
- Flutter December 2023 💙 Flutter Monthly
- Flutter November 2023 💙 Flutter Monthly
- Get Familiar with Dart 3, Make your Life Easier!
- Flutter 3.16 & Dart 3.2 重點整理來了!
- Flutter October 2023 💙 Flutter Monthly
- Flutter September 2023 💙 Flutter Monthly
- 添加預覽影片到 App Store,提升品牌形象
- Fluttercon 2023 技術研討會
- Wow! Flutter runs on Apple Vision Pro!
- 這次 Flutter 3.10 與 Dart 3 又強大了多少?Google IO 告訴你
- Flutter Meetup #1 聚會有什麼?還有 Flutter 四月大小事!
- 提升開發效率的好物,Mason 讓你輕鬆撰寫自定義模板!
- 教你製作強大的 Rive 動畫,完成一隻 Flutter Dash,在 APP 跟它互動!
- Flutter 如何根據 Flavor 多環境載入對應的 Firebase Config
- Isolates 在 Flutter 3.7 & Dart 2.19 的升級,你該知道一下!
- 讓人驚艷的 Flutter Forward,釋出 Flutter 3.7 和 Dart 2.19
- 學會運用 Flutter Widgetbook,該管好自己和公司的元件庫了!