在发送用于重置密码或验证用户电子邮件的电子邮件操作时,您可以通过继续 URL 传递状态。这使用户能够在操作完成后返回到应用程序。此外,您可以指定是否在安装时直接从移动应用程序而不是网页处理电子邮件操作链接。
这在以下常见场景中非常有用:
当前未登录的用户可能正在尝试访问需要用户登录的内容。但是,用户可能忘记了密码,因此触发了重置密码流程。在流程结束时,用户希望返回到他们尝试访问的应用程序部分。
应用程序只能提供对经过验证的帐户的访问权限。例如,时事通讯应用程序可能要求用户在订阅前验证他们的电子邮件。用户将通过电子邮件验证流程并期望返回到应用程序以完成他们的订阅。
通常,当用户在 Apple 应用程序上开始密码重置或电子邮件验证流程时,他们希望在应用程序内完成流程;通过 continue URL 传递状态的能力使这成为可能。
能够通过连续 URL 传递状态是 Firebase Auth 提供的一项强大功能,可以显着增强用户体验。
在电子邮件操作中传递状态/继续 URL
为了安全地传递 continue URL,需要在Firebase 控制台中将 URL 的域列入白名单。这是在身份验证部分通过将此域添加到登录方法选项卡下的授权域列表(如果尚不存在)来完成的。
发送密码重置电子邮件或验证电子邮件时,需要提供FIRActionCodeSettings
实例。该接口采用以下参数:
迅速
范围 | 类型 | 描述 |
---|---|---|
URL | 细绳 | 设置在不同上下文中具有不同含义的链接(state/continue URL):
|
iOSBundleID | 细绳 | 设置包 ID。如果已安装,这将尝试在 Apple 应用程序中打开链接。该应用程序需要在控制台中注册。如果未提供 Bundle ID,则此字段的值设置为 App 主包的包 ID。 |
androidPackageName | 细绳 | 设置 Android 包名称。如果已安装,这将尝试在 Android 应用程序中打开链接。 |
androidInstallIfNotAvailable | 布尔值 | 指定是否在设备支持 Android 应用程序且尚未安装该应用程序的情况下安装该应用程序。如果在没有 packageName 的情况下提供此字段,则会抛出一个错误,说明 packageName 必须与此字段一起提供。 |
androidMinimumVersion | 细绳 | 此流程中支持的应用程序的最低版本。如果指定了 minimumVersion,并且安装了旧版本的应用程序,用户将被带到 Play 商店升级应用程序。 Android 应用程序需要在控制台中注册。 |
handleCodeInApp | 布尔值 | 电子邮件操作链接是先在移动应用程序中打开还是先在 Web 链接中打开。默认为假。设置为 true 时,操作代码链接将作为通用链接或 Android 应用程序链接发送,如果已安装,将由应用程序打开。在错误的情况下,代码将首先发送到网络小部件,然后继续将重定向到应用程序(如果已安装)。 |
dynamicLinkDomain | 细绳 | 如果要使用 Firebase 动态链接打开当前链接,则设置要用于当前链接的动态链接域(或子域)。由于可以为每个项目配置多个动态链接域,因此该字段提供了明确选择一个的能力。如果未提供,则默认使用第一个域。 |
目标-C
范围 | 类型 | 描述 |
---|---|---|
URL | 字符串 | 设置在不同上下文中具有不同含义的链接(state/continue URL):
|
iOSBundleID | 字符串 | 设置包 ID。如果已安装,这将尝试在 Apple 应用程序中打开链接。该应用程序需要在控制台中注册。 |
androidPackageName | 字符串 | 设置 Android 包名称。如果已安装,这将尝试在 Android 应用程序中打开链接。 |
androidInstallIfNotAvailable | 布尔值 | 指定是否在设备支持 Android 应用程序且尚未安装该应用程序的情况下安装该应用程序。如果在没有 packageName 的情况下提供此字段,则会抛出一个错误,说明 packageName 必须与此字段一起提供。 |
androidMinimumVersion | 字符串 | 此流程中支持的应用程序的最低版本。如果指定了 minimumVersion,并且安装了旧版本的应用程序,用户将被带到 Play 商店升级应用程序。 Android 应用程序需要在控制台中注册。 |
handleCodeInApp | 布尔值 | 电子邮件操作链接是先在移动应用程序中打开还是先在 Web 链接中打开。默认为假。设置为 true 时,操作代码链接将作为通用链接或 Android 应用程序链接发送,如果已安装,将由应用程序打开。在错误的情况下,代码将首先发送到网络小部件,然后继续将重定向到应用程序(如果已安装)。 |
dynamicLinkDomain | 字符串 | 如果要使用 Firebase 动态链接打开当前链接,则设置要用于当前链接的动态链接域(或子域)。由于可以为每个项目配置多个动态链接域,因此该字段提供了明确选择一个的能力。如果未提供,则默认使用第一个域。 |
以下示例说明了如何使用自定义动态链接域example.page.link
(iOS 应用程序com.example.ios
或 Android 应用程序com.example.android
如果应用程序尚未安装且最低版本为12
,则将安装该应用程序的com.example.android
。深层链接将包含继续 URL 负载https://www.example.com/?email=user@example.com
。
迅速
var actionCodeSettings = ActionCodeSettings.init() actionCodeSettings.canHandleInApp = true let user = Auth.auth().currentUser() actionCodeSettings.URL = String(format: "https://www.example.com/?email=%@", user.email) actionCodeSettings.iOSbundleID = Bundle.main.bundleIdentifier! actionCodeSettings.setAndroidPakageName("com.example.android", installIfNotAvailable:true, minumumVersion:"12") // When multiple custom dynamic link domains are defined, specify which one to use. actionCodeSettings.dynamicLinkDomain = "example.page.link" user.sendEmailVerification(withActionCodeSettings:actionCodeSettings { error in if error { // Error occurred. Inspect error.code and handle error. return } // Email verification sent. })
目标-C
FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init]; actionCodeSettings.handleCodeInApp = YES; FIRUser *user = [FIRAuth auth].currentUser; NSString *urlString = [NSString stringWithFormat:@"https://www.example.com/?email=%@", user.email]; actionCodeSettings.URL = [NSURL URLWithString:urlString]; actionCodeSettings.iOSBundleID = [NSBundle mainBundle].bundleIdentifier; // When multiple custom dynamic link domains are defined, specify which one to use. actionCodeSettings.dynamicLinkDomain = @"example.page.link"; [actionCodeSettings setAndroidPackageName:@"com.example.android" installIfNotAvailable:YES minimumVersion:'12']; [user sendEmailVerificationWithActionCodeSettings:actionCodeSettings completion:^(NSError *_Nullable error) { if (error) { // Error occurred. Inspect error.code and handle error. return; } // Email verification sent. }];
配置 Firebase 动态链接
Firebase Auth 在发送要在移动应用程序中打开的链接时使用Firebase 动态链接。为了使用此功能,需要在 Firebase 控制台中配置动态链接。
启用 Firebase 动态链接:
- 在Firebase 控制台中,打开动态链接部分。
如果您尚未接受动态链接条款并创建动态链接域,请立即接受。
如果您已经创建了动态链接域,请记下它。动态链接域通常类似于以下示例:
example.page.link
当您配置 Apple 或 Android 应用程序以拦截传入链接时,您将需要此值。
配置 Android 应用程序:
- 如果您计划从您的 Android 应用程序处理这些链接,则需要在 Firebase 控制台项目设置中指定 Android 包名称。此外,还需要提供申请证书的SHA-1和SHA-256。
- 您还需要为 AndroidManifest.xml 文件中的深层链接配置意图过滤器。
- 有关更多信息,请参阅接收 Android 动态链接说明。
配置 Apple 应用程序:
- 如果您计划从您的应用程序处理这些链接,则需要在 Firebase 控制台项目设置中指定包 ID。此外,还需要指定 App Store ID 和 Apple Developer Team ID。
- 您还需要将 FDL 通用链接域配置为应用程序功能中的关联域。
- 如果您计划将您的应用程序分发到 iOS 8 及以下版本,您将需要将您的包 ID 设置为传入 URL 的自定义方案。
- 有关更多信息,请参阅接收 Apple 平台动态链接说明。
在 Web 应用程序中处理电子邮件操作
您可以指定是否要先处理来自 Web 应用程序的操作代码链接,然后在成功完成后重定向到另一个网页或移动应用程序,前提是移动应用程序可用。这是通过在FIRActionCodeSettings
(Obj-C) 或ActionCodeSettings
(Swift) 对象中将handleCodeInApp
设置为false
来完成的。虽然捆绑 ID 或 Android 包名称不是必需的,但提供它们将允许用户在电子邮件操作代码完成时重定向回指定的应用程序。
此处使用的网址是在电子邮件操作模板部分中配置的网址。为所有项目提供了一个默认值。请参阅自定义电子邮件处理程序以了解有关如何自定义电子邮件操作处理程序的更多信息。
在这种情况下, continueURL
查询参数中的链接将是一个 FDL 链接,其负载是ActionCodeSettings
对象中指定的URL
。虽然您可以在没有任何额外依赖的情况下拦截和处理来自您的应用程序的传入链接,但我们建议您使用 FDL 客户端库来为您解析深层链接。
在处理邮件验证等邮件动作时,需要从深层链接解析oobCode
查询参数中的动作代码,然后通过applyActionCode
应用,使更改生效,即验证邮件。
在移动应用程序中处理电子邮件操作
如果已安装,您可以指定是否要先在移动应用程序中处理操作代码链接。对于 Android 应用程序,您还可以通过androidInstallIfNotAvailable
指定要安装的应用程序(如果设备支持它并且尚未安装)。如果从不支持移动应用程序的设备单击链接,则会从网页打开它。这是通过在FIRActionCodeSettings
(Obj-C) 或ActionCodeSettings
(Swift) 对象中将handleCodeInApp
设置为true
来完成的。还需要指定移动应用程序的 Android 包名称或捆绑包 ID。此处使用的后备 web URL,当没有移动应用程序可用时,是在电子邮件操作模板部分中配置的。为所有项目提供了一个默认值。请参阅自定义电子邮件处理程序以了解有关如何自定义电子邮件操作处理程序的更多信息。
在这种情况下,发送给用户的移动应用程序链接将是一个 FDL 链接,其有效负载是操作代码 URL,在控制台中配置,具有查询参数oobCode
、 mode
、 apiKey
和continueUrl
。后者将是FIRActionCodeSettings
(Obj-C) 或ActionCodeSettings
(Swift) 对象中指定的原始URL
。虽然您可以在没有任何额外依赖的情况下拦截和处理来自您的应用程序的传入链接,但我们建议您使用 FDL 客户端库来为您解析深层链接。可以直接从移动应用程序应用操作代码,类似于从自定义电子邮件处理程序部分中描述的 Web 流处理它的方式。
在处理邮件验证等邮件动作时,需要从深层链接解析oobCode
查询参数中的动作代码,然后通过applyActionCode
应用,使更改生效,即验证邮件。