iT邦幫忙

2025 iThome 鐵人賽

DAY 18
1

昨天成功地為App建立推播分享,能否創造一種更無縫、更使用者友善的體驗,讓使用者無論是點擊朋友分享的連結,還是點擊我們發送的推播通知,都能像穿越任意門一樣,直接被帶到App內的指定頁面?

而深層連結 (Deep Linking)是一種能將使用者從App外部(網站、另個App、通知)直接導向App內部特定內容的機制。今天就要來為App設定專屬的「地址」,並讓App知道如何接收和處理這些來自外部的「信件」。

第一部分:了解深層連結的種類

在實作之前,我們需要了解兩種主要的深層連結:

Custom URL Schemes(自訂 URL 協定):

  • 格式:inspiration://insight/123
  • 優點:設定相對簡單,非常適合用於推播通知或已知會安裝App的使用者間的跳轉。
  • 缺點:如果使用者手機上沒有安裝我們的App,點擊這個連結會沒有任何反應或報錯。

Universal Links(iOS) &App Links(Android):

  • 格式:https://www.your-app-domain.com/insight/123
  • 優點:使用標準的https網址,如果App已安裝,則直接開啟 App。如果未安裝,則會降級 (fallback) 到開啟網頁,這是現代App的首選方案。
  • 缺點:設定複雜,需要你擁有一個網域,並在網站伺服器上配置特定的認證檔案。

考量到只想做30天MVP的目標,將專注於實作第一種:Custom URL Schemes,因為它足以實現我們從推播通知跳轉到App的核心需求,且無需額外的網站設定。

第二步:設定平台的URL Scheme

要讓作業系統認得我們的專屬地址inspiration://,我們必須在Android和iOS的設定檔中進行「註冊」。

iOS設定 (Info.plist)

Step1. 用VS Code或Xcode打開ios/Runner/Info.plist 檔案。
Step2. 在 標籤的結尾( 之前)加入以下XML程式碼:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLName</key>
        <string>com.example.threeInspiration</string> <key>CFBundleURLSchemes</key>
        <array>
            <string>inspiration</string> </array>
    </dict>
</array>

Android設定(AndroidManifest.xml)

Step1. 打開 android/app/src/main/AndroidManifest.xml檔案。
Step2. 找到 <activity android:name=".MainActivity" ...> 這個區塊。
Step3. 在 標籤之前,加入以下 區塊:

<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="inspiration"/> </intent-filter>

成以上設定,App就已經具備了接收inspiration:// 連結的能力。

第三步:在Flutter中監聽傳入的連結

光能接收還不夠,我們還要在Flutter層監聽並處理這些連結。這裡我們將處理兩種情況:點擊分享連結和點擊推播通知。

情況一:處理分享連結(使用 uni_links)

Step1. 安裝套件:
flutter pub add uni_links
Step2. 監聽連結:在App的主頁面(如HomePage)的initState中設定監聽器。

情況二:處理推播通知點擊(使用 firebase_messaging)

firebase_messaging套件本身就提供了監聽通知點擊事件的Stream,這是更現代且推薦的做法。

Stpe1. 修改main.dart: main函式中,加入背景訊息處理。
Step2. 修改n8n的FCM酬載 (Payload):
在Day 15的n8n工作流中,修改HTTP Request節點的Body,在message物件中加入data欄位。

明日預告:引入Firebase Firestore與Auth

現在App可以透過分享和通知,在App的內外自由穿梭,體驗大大提升,蛋目前我們的App對於使用者來說,還算停留在一個「單機」的體驗。如果使用者換了手機,或是想在平板上也使用App,所有的收藏資料都還停留在舊裝置上。

明天,將引入Firebase Firestore,將使用者的核心資料存儲到雲端,為多端同步打下堅實的基礎!


【哈囉你好:)感謝你的閱讀!其他我會常出沒的地方:Threads


上一篇
30 天做一個極簡App:原生分享功能
下一篇
30 天做一個極簡App:多端同步 - Firebase Firestore與Auth
系列文
Mobile Dev|日更靈感來源 App:Flutter × LLM × n8n,每天只推 3 則!19
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言