使用Firebase动态/深度链接时重定向URL丢失查询参数
Firebase动态链接保留Patreon OAuth参数配置及替代方案
一、配置Firebase动态链接保留查询参数
1. 控制台端配置
- 登录Firebase控制台,进入Dynamic Links模块
- 找到目标动态链接(
https://myappname.page.link/patreon)并点击编辑 - 在「深度链接行为」区域,开启传递所有请求参数到深度链接;若需精准控制,可设置自定义参数规则,确保
code参数被包含在内 - 确认动态链接的「链接前缀」配置未限制参数传递
2. 应用端代码校验
使用firebase_dynamic_links包接收链接时,需完整解析URL的查询参数:
import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; // 处理应用启动时的初始链接 Future<void> handleInitialDynamicLink() async { final PendingDynamicLinkData? data = await FirebaseDynamicLinks.instance.getInitialLink(); final Uri? deepLink = data?.link; if (deepLink != null) { final String? code = deepLink.queryParameters['code']; if (code != null) { // 处理Patreon返回的授权code } } } // 监听应用后台运行时唤起的链接 void listenToDynamicLinks() { FirebaseDynamicLinks.instance.onLink.listen((dynamicLinkData) { final Uri deepLink = dynamicLinkData.link; final String? code = deepLink.queryParameters['code']; if (code != null) { // 处理授权code } }); }
注意不要仅提取链接的path部分,需通过Uri对象的queryParameters完整获取参数。
二、无需Dynamic Links的替代方案
1. 使用App Links(Android)+ Universal Links(iOS)
这是官方推荐的原生深度链接方案,直接绑定域名,无需中间转发,参数传递更可靠:
- Android配置:在
AndroidManifest.xml中添加对应域名的intent-filter,并在域名的.well-known目录放置assetlinks.json完成所有权验证 - iOS配置:在
Info.plist中添加associated domains,并在域名的.well-known目录放置apple-app-site-association文件 - Flutter端接收链接:使用
uni_links包监听链接:
import 'package:uni_links/uni_links.dart'; // 处理应用启动时的初始链接 Future<void> handleInitialLink() async { final Uri? initialUri = await getInitialUri(); if (initialUri != null) { final String? code = initialUri.queryParameters['code']; // 处理授权code } } // 监听实时链接跳转 void listenToLinks() { uriLinkStream.listen((Uri? uri) { if (uri != null) { final String? code = uri.queryParameters['code']; // 处理授权code } }, onError: (error) { // 错误处理逻辑 }); }
2. 自定义URL Scheme(不推荐)
可使用myapp://patreon?code=xxx这类Scheme直接唤起应用,但安全性较低(其他应用可注册同名Scheme),仅适用于兼容性要求极高的场景,同样可通过uni_links包监听链接。
内容的提问来源于stack exchange,提问作者Puffing Devil
相关产品推荐
相关产品推荐

