Flutter:动态链接未启动应用程序
Posted
技术标签:
【中文标题】Flutter:动态链接未启动应用程序【英文标题】:Flutter : Dynamic Link not launching the app 【发布时间】:2021-06-24 14:39:42 【问题描述】:我正在使用 firebase 动态链接在我的应用中打开电子邮件验证链接,但不幸的是,点击该链接时该链接无法启动应用。
到目前为止我做了什么
创建新用户时,会通过电子邮件发送一个链接以进行验证:
if(firebaseUser != null && !firebaseUser.emailVerified)
await createUserInDatabaseIfNew(firebaseUser);
var actionCodeSettings = auth.ActionCodeSettings(
url: 'https://muslimcoloc.page.link/?email=$firebaseUser.email',
dynamicLinkDomain: "muslimcoloc.page.link",
androidInstallApp: true,
androidMinimumVersion: "12",
androidPackageName: "com.app.muslim_coloc",
iosBundleId: "com.muslim_coloc.ios",
handleCodeInApp: true,
);
await firebaseUser.sendEmailVerification(actionCodeSettings);
我在 firebase 控制台中获得了 dynamicLinkDomain:
然后,我使用firebase dynamic links package 处理我的main.dart
文件中的链接接收:
void main() async
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(
MyApp(),
);
class MyApp extends StatelessWidget
MyApp(Key key, ) : super(key: key);
@override
Widget build(BuildContext context)
return AppView();
class AppView extends StatefulWidget
const AppView(
Key key,
) : super(key: key);
@override
_AppViewState createState() => _AppViewState();
class _AppViewState extends State<AppView> with WidgetsBindingObserver
@override
void initState()
super.initState();
WidgetsBinding.instance.addObserver(this);
@override
void didChangeAppLifecycleState(AppLifecycleState state)
if (state == AppLifecycleState.resumed)
this.initDynamicLinks();
void initDynamicLinks() async
FirebaseDynamicLinks.instance.onLink(
onSuccess: (PendingDynamicLinkData dynamicLink) async
final Uri deepLink = dynamicLink?.link;
FirebaseAuth auth = FirebaseAuth.instance;
//Get actionCode from the dynamicLink
var actionCode = deepLink.queryParameters['oobCode'];
try
await auth.checkActionCode(actionCode);
await auth.applyActionCode(actionCode);
// If successful, reload the user:
auth.currentUser.reload();
on FirebaseAuthException catch (e)
if (e.code == 'invalid-action-code')
print('The code is invalid.');
if (deepLink != null)
Navigator.pushNamed(context, deepLink.path);
,
onError: (OnLinkErrorException e) async
print('onLinkError');
print(e.message);
);
final PendingDynamicLinkData data =
await FirebaseDynamicLinks.instance.getInitialLink();
final Uri deepLink = data?.link;
if (deepLink != null)
Navigator.pushNamed(context, deepLink.path);
@override
Widget build(BuildContext context)
return MaterialApp(...)
当我点击电子邮件的链接时,应用程序无法启动,浏览器也无法启动。这是发生了什么:
它尝试在浏览器上启动某些东西,但随后又回到 gmail。
但是,如果我在桌面浏览器中单击该链接,它可以正常工作,电子邮件已通过验证。
我很难理解这是怎么回事。我做事的方式有问题吗?
【问题讨论】:
除此电子邮件链接外,您是否成功处理了应用中的动态链接?还是所有动态链接都不能在手机上使用? 我不知道,这是我尝试实现的第一个:/ 您使用什么版本的动态链接,以便更好地帮助您? 你的意思是包的版本?最后一个^0.8.0
我发布了一个带有工作代码的答案,请检查一下,如果它解决了您的问题,请告诉我。
【参考方案1】:
您应该根据文档编写一个函数来处理您的动态链接,这在当前正在使用的应用程序中对我有用:
void handleDynamicLinks() async
///To bring INTO FOREGROUND FROM DYNAMIC LINK.
FirebaseDynamicLinks.instance.onLink(
onSuccess: (PendingDynamicLinkData dynamicLinkData) async
await _handleDeepLink(dynamicLinkData);
,
onError: (OnLinkErrorException e) async
print('DynamicLink Failed: $e.message');
return e.message;
,
);
final PendingDynamicLinkData data =
await FirebaseDynamicLinks.instance.getInitialLink();
_handleDeepLink(data);
// bool _deeplink = true;
_handleDeepLink(PendingDynamicLinkData data) async
final Uri? deeplink = data.link;
if (deeplink != null)
print('Handling Deep Link | deepLink: $deeplink');
在initState中:
@override
void initState()
handleDynamicLinks();
super.initState();
在您的主页中编写此逻辑。不在void(main..etc)
但是在那之后的第一个小部件中,它应该可以工作。
另外,一定要仔细检查你的包名,即com.example.yourAwesomeApp123
,它让整个系统知道当动态链接被按下时要打开什么应用程序。
【讨论】:
所以,与我所拥有的相比,您所做的是:1)摆脱WidgetsBindingObserver
,我在应用程序暂停时使用它来运行代码,但没关系,它是一样的. 2) 在方法中重构onSuccess
的内容,而不是将代码直接放入其中(技术上应该是相同的,不是吗?)我尝试了这些修改,但不幸的是,问题仍然相同。该应用程序未启动:/
您是如何生成动态链接的?遵循从您的代码生成它的文档,而不是 firebase 控制台。这可能意味着链接有问题,如果不尝试以编程方式进行,我们无法排除。
嗯,我只是跟着官方文档firebase.flutter.dev/docs/auth/usage/#open-link-in-app
这意味着您的应用程序包或包名称未添加到动态链接中。这是设备知道要启动什么应用的唯一方法。
经过进一步调查,您似乎是对的,包名不正确,出于某种原因,我还补充说:github.com/FirebaseExtended/flutterfire/issues/… 您能否更新您对未来人们的回应问题?以上是关于Flutter:动态链接未启动应用程序的主要内容,如果未能解决你的问题,请参考以下文章
冷启动 iOS 14 时未处理 iOS Firebase 动态链接