電子郵件動作中的狀態

您可以在傳送密碼重設或驗證使用者電子郵件的電子郵件動作時,透過繼續網址傳遞狀態。這樣一來,使用者就能在動作完成後返回應用程式。此外,您可以指定是否要在安裝於行動應用程式 (而非網頁) 時,直接從行動應用程式處理電子郵件動作連結。

這在下列常見情境中非常實用:

  • 使用者 (目前尚未登入) 可能會嘗試存取需要登入的內容。然而,使用者可能忘記了自己的密碼,因而觸發重設密碼流程。流程結束時,使用者會預期返回先前要存取的應用程式區段。

  • 應用程式只能提供已驗證帳戶的存取權。例如,電子報應用程式可能會要求使用者先驗證電子郵件地址,才能訂閱。使用者會進行電子郵件驗證流程,並預期返回應用程式完成訂閱。

  • 一般來說,當使用者想在 Apple 應用程式中啟動密碼重設或電子郵件驗證流程時,他們會預期在應用程式中完成流程;透過繼續網址傳遞狀態,就可以達到這個目的。

能夠透過繼續網址傳遞狀態是 Firebase 驗證提供的強大功能,可大幅改善使用者體驗。

在電子郵件動作中傳遞狀態/繼續網址

為了安全地傳遞繼續網址,您需要將網址的網域列入 Firebase 控制台的許可清單。方法是在「Authentication」(驗證) 部分中,將這個網域新增至「Sign-in method」分頁下方的「Authorized domains」清單 (如果尚未加入的話)。

傳送密碼重設電子郵件或驗證電子郵件時,必須提供 ActionCodeSettings 執行個體。此介面使用以下參數:

參數 類型 說明
url 字串

設定在不同情況下具有不同意義的連結 (狀態/繼續網址):

  • 在網頁動作小工具中處理連結時,這就是 continueUrl 查詢參數中的深層連結。
  • 如果是直接在應用程式中處理連結,這是 Dynamic Link 深層連結中的 continueUrl 查詢參數。
iOSBundleId 字串 設定軟體包 ID。如果已安裝 Apple 應用程式,系統將嘗試開啟連結。您必須在 Play 管理中心註冊應用程式。如未提供軟體包 ID,這個欄位的值會設為應用程式主要套件的軟體包 ID。
androidPackageName 字串 設定 Android 套件名稱。如果已安裝 Android 應用程式,系統將嘗試在開啟連結。
androidInstallApp bool 指定是否要在裝置支援 Android 應用程式,且應用程式尚未安裝的情況下安裝。如果提供這個欄位時沒有 packageName,系統會擲回錯誤,指出必須與這個欄位一併提供 packageName。
androidMinimumVersion 字串 此流程支援的應用程式最低版本。如果您指定 minVersion,且已安裝舊版應用程式,系統會將使用者導向 Play 商店,以便升級應用程式。您需要在 Play 管理中心註冊該 Android 應用程式。
handleCodeInApp bool 指定先在行動應用程式或網頁連結中開啟電子郵件動作連結。預設值為 false。設為 true 時,動作代碼連結會以通用連結或 Android 應用程式連結的形式傳送,安裝完成後會由應用程式開啟。如果是錯誤情況,程式碼會先傳送至網頁小工具,安裝完成後繼續重新導向至應用程式。
dynamicLinkDomain 字串 設定目前連結要使用 Firebase Dynamic Links 開啟的動態連結網域 (或子網域)。由於每項專案可以設定多個動態連結網域,這個欄位可讓您明確選擇一個網域。如未提供,預設會使用第一個網域。

以下範例說明如何利用自訂動態連結網域 example.page.link (iOS 應用程式 com.example.ios 或 Android 應用程式 com.example.android),傳送要先以 Firebase 動態連結的形式在行動應用程式中開啟的電子郵件驗證連結。如果尚未安裝,系統會安裝該應用程式,最低版本為 12。深層連結將包含接續網址酬載 https://www.example.com/?email=user@example.com

final user = FirebaseAuth.instance.currentUser;

final actionCodeSettings = ActionCodeSettings(
  url: "http://www.example.com/verify?email=${user?.email}",
  iOSBundleId: "com.example.ios",
  androidPackageName: "com.example.android",
);

await user?.sendEmailVerification(actionCodeSettings);

如果傳送的連結是專為行動應用程式開啟的連結,Firebase 驗證會使用 Firebase 動態連結。如要使用這項功能,您必須在 Firebase 控制台中設定 Dynamic Links。

  1. 啟用 Firebase Dynamic Links:

    1. 在 Firebase 控制台中開啟「Dynamic Links」部分。

    2. 如果您尚未接受 Dynamic Links 條款並建立 Dynamic Links 網域,請立即採取行動。

    3. 若您已建立 Dynamic Links 網域,請記下該網域。Dynamic Links 網域通常如以下範例所示:

      example.page.link

    4. 將 Apple 或 Android 應用程式設為攔截傳入連結時,您需要這個值。

  2. 設定 Android 應用程式:

    1. 如果您打算從 Android 應用程式處理這些連結,就需要在 Firebase 控制台的專案設定中指定 Android 套件名稱。此外,您也必須提供應用程式憑證的 SHA-1 和 SHA-256。
    2. 此外,您也必須在 AndroidManifest.xml 檔案中為深層連結設定意圖篩選器。
    3. 詳情請參閱取得 Android Dynamic Links 操作說明
  3. 設定 Apple 應用程式:

    1. 如果您打算從應用程式處理這些連結,就必須在 Firebase 控制台的專案設定中指定軟體包 ID。此外,您也必須指定 App Store ID 和 Apple Developer Team ID。
    2. 您也需在應用程式功能中,將 FDL 通用連結網域設為關聯網域。
    3. 如果您打算將應用程式發行到 iOS 8 以下版本,則必須將軟體包 ID 設為傳入網址的自訂配置。
    4. 詳情請參閱接收 Apple 平台 Dynamic Links 操作說明

處理網頁應用程式中的電子郵件動作

您可以指定是否要先處理網頁應用程式的動作代碼連結,然後在成功完成後再重新導向至其他網頁或行動應用程式 (前提是該行動應用程式可供使用)。方法是將 ActionCodeSettings 物件中的 handleCodeInApp 設為 false。雖然您不一定要提供軟體包 ID 或 Android 套件名稱,但提供這些 ID 可讓使用者在完成電子郵件動作程式碼後,重新導回指定應用程式。

這裡使用的網址是電子郵件動作範本區段中設定的網址。已佈建所有專案的預設 ID。如要進一步瞭解如何自訂電子郵件動作處理常式,請參閱自訂電子郵件處理常式

在此情況下,continueURL 查詢參數中的連結會是 FDL 連結,其酬載是 ActionCodeSettings 物件中指定的 URL。雖然您不必任何其他依附元件就能攔截及處理應用程式傳入的連結,但我們還是建議您使用 FDL 用戶端程式庫,為您剖析深層連結。

處理電子郵件驗證等電子郵件動作時,您必須從深層連結剖析 oobCode 查詢參數的動作程式碼,然後透過 applyActionCode 套用變更,變更才會生效 (例如要驗證電子郵件)。

處理行動應用程式中的電子郵件動作

您可以指定是否要先在行動應用程式中處理動作程式碼連結 (若該連結已安裝)。使用 Android 應用程式時,您也可以透過 androidInstallApp 指定在裝置支援且未安裝的情況下,要安裝的應用程式。如果使用者點擊連結的裝置不支援行動應用程式,則會改為透過網頁開啟。方法是將 ActionCodeSettings 物件中的 handleCodeInApp 設為 true。此外,您也需要指定行動應用程式的 Android 套件名稱或軟體包 ID。在沒有行動應用程式可用的情況下,這裡使用的備用網址即為電子郵件動作範本區段中的設定。系統會為所有專案佈建預設值。如要進一步瞭解如何自訂電子郵件動作處理常式,請參閱自訂電子郵件處理常式

在這種情況下,傳送給使用者的行動應用程式連結會是 FDL 連結,其酬載是動作代碼網址,在主控台中設定,使用查詢參數 oobCodemodeapiKeycontinueUrl。後者是 ActionCodeSettings 物件中指定的原始 URL。雖然您無需任何其他依附元件就能攔截及處理應用程式傳入的連結,但我們還是建議您使用 FDL 用戶端程式庫,為您剖析深層連結。動作程式碼可以直接從行動應用程式套用,方法與在自訂電子郵件處理常式一節所述的網路流程中處理的方式類似。

處理電子郵件驗證等電子郵件動作時,您必須從深層連結剖析 oobCode 查詢參數的動作程式碼,然後透過 applyActionCode 套用變更,變更才會生效 (例如要驗證電子郵件)。