无法正确捕获以编程方式生成的动态链接
FirebaseDynamicLinks.instance.getInitialLink().
如果该应用已关闭。但是,如果应用已打开,则侦听器会正确检测到该应用是否有新的传入动态链接。对于设置问题,我尚不清楚如何生成动态链接。
要复制
首先按照记录设置Firebase for Flutter项目。然后设置一个动态链接:
/// See also
/// https://firebase.google.com/docs/dynamic-links/use-cases/rewarded-referral
/// how to implement referral schemes using Firebase.
Future<ShortDynamicLink> buildDynamicLink(String userId) async {
final PackageInfo packageInfo = await PackageInfo.fromPlatform();
final String packageName = packageInfo.packageName;
var androidParams = AndroidParameters(
packageName: packageInfo.packageName,
minimumVersion: Constants.androidVersion, // app version and not the Android OS version
);
var iosParams = IosParameters(
bundleId: packageInfo.packageName,
minimumVersion: Constants.iosVersion, // app version and not the iOS version
appStoreId: Constants.iosAppStoreId,
);
var socialMetaTagParams = SocialMetaTagParameters(
title: 'Referral Link',
description: 'Referred app signup',
);
var dynamicLinkParams = DynamicLinkParameters(
uriPrefix: 'https://xxxxxx.page.link',
link: Uri.parse('https://www.xxxxxxxxx${Constants.referralLinkPath}?${Constants.referralLinkParam}=$userId'),
androidParameters: androidParams,
iosParameters: iosParams,
socialMetaTagParameters: socialMetaTagParams,
);
return dynamicLinkParams.buildShortLink();
}
然后可以与其他新用户共享此动态链接。
我在应用启动时监听初始链接,然后监听新的传入链接。
1)如果应用程序未在运行,但getInitialLink无法获取,则链接会正确打开该应用程序。
2)如果该应用程序已打开,则链接已被侦听器正确捕获,并且可以正常工作。
这里是非常简单的main.dart,我用来验证1)使用FirebaseDynamicLinks.instance.getInitialLink()找不到初始链接。
void main() async {
WidgetsFlutterBinding.ensureInitialized();
PendingDynamicLinkData linkData = await FirebaseDynamicLinks.instance.getInitialLink();
String link = linkData?.link.toString();
runApp(MyTestApp(link: link));
}
class MyTestApp extends StatelessWidget {
final String link;
MyTestApp({this.link});
@override
Widget build(BuildContext context) {
return MaterialApp(
builder: (BuildContext context, Widget child) {
return Scaffold(
body: Container(
child: Center(
child: Text('Initial dynamic Firebase link: $link')
),
),
);
}
);
}
}
预期的行为
链接应打开应用程序并触发FirebaseDynamicLinks.instance.getInitialLink().
。
其他上下文
我希望可以使用Firebase控制台正确配置Firebase项目。为了验证这一点,我创建了一个用于Firebase Auth“通过电子邮件链接注册”的动态链接,并且这些动态链接在未打开应用程序的情况下也按预期工作。
这里的要点是,我以编程方式生成的引荐动态链接正在关闭时打开应用程序,但并没有被FirebaseDynamicLinks.instance.getInitialLink()
捕获,并且更令人困惑的是,如果应用程序打开,它会按预期工作。在这种情况下,它会被侦听器FirebaseDynamicLinks.instance.onLink
捕获。
[我还在Flutter中设置了WidgetsBindingObserver
,以在应用程序重新获得焦点时根据需要处理该回调。
非常感谢您的帮助。调试非常棘手,因为您需要在真实设备上而不是在模拟器中进行调试。更糟的是,在动态链接打开应用程序时,我没有弄清楚如何附加调试器。这意味着我也不得不进一步调查此问题。
1)getInitialLink() 2)onLink()。
如果您的应用程序已打开并且您单击动态链接,则将调用FirebaseDynamicLinks.instance.onLink(),如果您的应用程序被杀死或从PlayStore中打开,则您将从您首先需要初始化
static void initDynamicLinks() async {
final PendingDynamicLinkData data =
await FirebaseDynamicLinks.instance.getInitialLink();
final Uri deepLink = data?.link;
if (deepLink != null && deepLink.queryParameters != null) {
SharedPrefs.setValue("param", deepLink.queryParameters["param"]);
}
FirebaseDynamicLinks.instance.onLink(
onSuccess: (PendingDynamicLinkData dynamicLink) async {
final Uri deepLink = dynamicLink?.link;
if (deepLink != null && deepLink.queryParameters != null) {
SharedPrefs.setValue("param", deepLink.queryParameters["param]);
}
}, onError: (OnLinkErrorException e) async {
print(e.message);
});
}