Динамически сгенерированные динамические c ссылки неправильно отлавливаются
FirebaseDynamicLinks.instance.getInitialLink().
, если приложение закрыто. Однако, если приложение открыто, слушатель правильно обнаруживает новые входящие динамические ссылки c. Мне не ясно, если это проблема установки, как я генерирую ссылку Dynami c.
Для воспроизведения
Сначала настройте Firebase для проекта Flutter, как описано в документации. Затем для установки динамической c ссылки:
/// 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();
}
Эта динамическая c ссылка затем может быть передана другим новым пользователям.
Я слушаю начальные ссылки при запуске приложения и затем для новых входящих ссылок.
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. Чтобы убедиться в этом, я создал динамическую c ссылку для использования с Firebase Auth 'регистрация по электронной почте', и эти динамические c ссылки работают должным образом, даже если приложение не открыто.
Дело в том, что реферальная динамическая ссылка c, которую я генерирую программным способом, открывает приложение, когда оно закрывается, но затем не обрабатывается FirebaseDynamicLinks.instance.getInitialLink()
, и, что еще более запутанно, работает, как и ожидалось, если приложение открыто. В этом случае он перехватывается слушателем FirebaseDynamicLinks.instance.onLink
.
Я также настроил WidgetsBindingObserver
во Flutter для обработки этого обратного вызова по мере необходимости, когда приложение вернуло фокус.
Любая помощь очень ценится. Отладка очень сложна, так как вам нужно делать это на реальном устройстве, а не в симуляторе. Что еще хуже, я не понял, как подключить отладчик, в то время как ссылка Dynami c открывает приложение. Это означает, что я также застрял в дальнейшем изучении этого вопроса.