获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

在电子邮件操作中传递状态

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

在发送电子邮件操作以重置密码或验证用户的电子邮件时,您可以通过继续 URL 传递状态。这使用户能够在操作完成后返回应用程序。此外,您可以指定在安装移动应用程序而不是网页时是否直接从移动应用程序处理电子邮件操作链接。

这在以下常见场景中非常有用:

  • 当前未登录的用户可能正在尝试访问需要用户登录的内容。但是,用户可能忘记了他们的密码,因此触发了重置密码流程。在流程结束时,用户希望返回到他们尝试访问的应用程序部分。

  • 应用程序只能提供对经过验证的帐户的访问权限。例如,时事通讯可能会要求用户在订阅之前验证他们的电子邮件。用户将通过电子邮件验证流程并期望返回应用程序以完成他们的订阅。

  • 在其他情况下,用户可能已经从他们的移动设备启动了流程,并希望在验证后返回到他们的移动应用程序而不是浏览器。

能够通过 continue URL 传递状态是 Firebase Auth 提供的一项强大功能,可以显着增强用户体验。

在电子邮件操作中传递状态/继续 URL

为了安全地传递继续 URL,该 URL 的域需要在Firebase 控制台中列入白名单。这是在身份验证部分中完成的,方法是将此域添加到登录方法选项卡下的授权域列表中(如果它尚不存在)。

发送密码重置邮件或验证邮件时需要提供ActionCodeSettings实例。它可以使用关联的ActionCodeSettings.Builder类创建,该类包含以下方法:

方法描述
setUrl(String url)

设置在不同上下文中具有不同含义的链接(状态/继续 URL):

  • 在 Web 操作小部件中处理链接时,这是continueUrl查询参数中的深层链接。
  • 直接在app中处理链接时,这是动态链接的深层链接中的continueUrl查询参数。
setIOSBundleId(String iOSBundleId)设置 iOS 捆绑包 ID。如果已安装,这将尝试在 iOS 应用程序中打开该链接。 iOS 应用需要在控制台中注册。
setAndroidPackageName(String androidPackageName, boolean installIfNotAvailable, String minimumVersion)设置 Android 包名称。如果已安装,这将尝试在 android 应用程序中打开该链接。如果 installIfNotAvailable 设置为true ,它指定如果设备支持并且尚未安装该应用程序,是否安装 Android 应用程序。如果指定了 minimumVersion,并且安装了旧版本的应用程序,用户将被带到 Play 商店以升级应用程序。 Android 应用需要在控制台中注册。
setHandleCodeInApp(boolean status)电子邮件操作链接是首先在移动应用程序中打开还是在 Web 链接中打开。默认值为假。设置为 true 时,操作代码链接将作为通用链接或 Android 应用链接发送,如果已安装,将由应用打开。在 false 情况下,代码将首先发送到 Web 小部件,然后继续将重定向到已安装的应用程序。
setDynamicLinkDomain(String dynamicLinkDomain)如果要使用 Firebase 动态链接打开当前链接,则设置用于当前链接的动态链接域(或子域)。由于每个项目可以配置多个动态链接域,因此该字段提供了明确选择一个的能力。如果没有提供,则默认使用第一个域。

以下示例说明如何发送将首先在移动应用中打开的电子邮件验证链接作为 Firebase 动态链接(iOS 应用com.example.ios或 Android 应用com.example.android )。深层链接将包含继续 URL 有效负载https://www.example.com/?email=user@example.com

Java

FirebaseAuth auth = FirebaseAuth.getInstance();
FirebaseUser user = auth.getCurrentUser();

String url = "http://www.example.com/verify?uid=" + user.getUid();
ActionCodeSettings actionCodeSettings = ActionCodeSettings.newBuilder()
        .setUrl(url)
        .setIOSBundleId("com.example.ios")
        // The default for this is populated with the current android package name.
        .setAndroidPackageName("com.example.android", false, null)
        .build();

user.sendEmailVerification(actionCodeSettings)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "Email sent.");
                }
            }
        });

Kotlin+KTX

val auth = Firebase.auth
val user = auth.currentUser!!

val url = "http://www.example.com/verify?uid=" + user.uid
val actionCodeSettings = ActionCodeSettings.newBuilder()
        .setUrl(url)
        .setIOSBundleId("com.example.ios")
        // The default for this is populated with the current android package name.
        .setAndroidPackageName("com.example.android", false, null)
        .build()

user.sendEmailVerification(actionCodeSettings)
        .addOnCompleteListener { task ->
            if (task.isSuccessful) {
                Log.d(TAG, "Email sent.")
            }
        }

Firebase Auth 在发送要在移动应用程序中打开的链接时使用Firebase 动态链接。要使用此功能,需要在 Firebase 控制台中配置动态链接。

  1. 启用 Firebase 动态链接:

    1. Firebase 控制台中,打开动态链接部分。
    2. 如果您尚未接受动态链接条款并创建动态链接域,请立即执行。

      如果您已经创建了动态链接域,请记下它。动态链接域通常类似于以下示例:

      example.page.link

      当您配置 Apple 或 Android 应用程序以拦截传入链接时,您将需要此值。

  2. 配置 Android 应用程序:

    1. 如果您计划从 Android 应用程序处理这些链接,则需要在 Firebase 控制台项目设置中指定 Android 包名称。另外,需要提供申请证书的SHA-1和SHA-256。
    2. 您还需要在 AndroidManifest.xml 文件中为深层链接配置意图过滤器。
    3. 有关这方面的更多信息,请参阅接收 Android 动态链接说明
  3. 配置 iOS 应用程序:

    1. 如果您计划从 iOS 应用程序处理这些链接,则需要在 Firebase 控制台项目设置中指定 iOS 捆绑包 ID。此外,App Store ID 和 Apple Developer Team ID 也需要指定。
    2. 您还需要将 FDL 通用链接域配置为应用程序功能中的关联域。
    3. 如果您计划将应用程序分发到 iOS 8 及以下版本,则需要将您的 iOS 捆绑 ID 设置为传入 URL 的自定义方案。
    4. 有关这方面的更多信息,请参阅接收 iOS 动态链接说明

在 Web 应用程序中处理电子邮件操作

您可以指定是否要先处理来自 Web 应用程序的操作代码链接,然后在成功完成后重定向到另一个网页或移动应用程序,前提是移动应用程序可用。这是通过在ActionCodeSettings.Builder对象中调用setHandleCodeInApp(false)来完成的。虽然不需要 iOS 包 ID 或 Android 包名称,但提供它们将允许用户在电子邮件操作代码完成时重定向回指定的应用程序。

此处使用的 Web URL 是在电子邮件操作模板部分中配置的 URL。为所有项目配置了一个默认值。请参阅自定义电子邮件处理程序以了解有关如何自定义电子邮件操作处理程序的更多信息。

在这种情况下, continueUrl查询参数中的链接将是一个 FDL 链接,其负载是ActionCodeSettings对象中指定的URL 。虽然您可以拦截和处理来自应用程序的传入链接而无需任何额外依赖,但我们建议使用 FDL 客户端库为您解析深层链接。

在处理电子邮件验证等电子邮件操作时,需要从深度链接中解析来自oobCode查询参数的操作代码,然后通过applyActionCode应用以使更改生效,即要验证的电子邮件。

在移动应用程序中处理电子邮件操作

如果已安装,您可以指定是否要首先处理移动应用程序中的操作代码链接。对于 Android 应用程序,您还可以通过installIfNotAvailable布尔值指定要安装的应用程序(如果设备支持它并且尚未安装)。如果从不支持移动应用程序的设备单击该链接,则会改为从网页打开该链接。这是通过在ActionCodeSettings.Builder对象中调用setHandleCodeInApp(true)来完成的。还需要指定移动应用程序的 Android 包名称或 iOS 包 ID。

当没有可用的移动应用程序时,此处使用的后备 Web URL 是在电子邮件操作模板部分中配置的。为所有项目配置了一个默认值。请参阅自定义电子邮件处理程序以了解有关如何自定义电子邮件操作处理程序的更多信息。

在这种情况下,发送给用户的移动应用链接将是一个 FDL 链接,其有效负载是操作代码 URL,在控制台中配置,查询参数oobCodemodeapiKeycontinueUrl 。后者将是ActionCodeSettings对象中指定的原始URL 。虽然您可以拦截和处理来自应用程序的传入链接而无需任何额外依赖,但我们建议使用 FDL 客户端库为您解析深层链接。操作代码可以直接从移动应用程序应用,类似于从自定义电子邮件处理程序部分中描述的 Web 流处理它的方式。

在处理电子邮件验证等电子邮件操作时,需要从深度链接中解析来自oobCode查询参数的操作代码,然后通过applyActionCode应用以使更改生效,即要验证的电子邮件。