应用终止状态下通过Firebase动态链接打开崩溃问题排查
问题描述
我已在应用中集成Firebase动态链接,该功能在应用处于前台和后台状态时运行正常,但当应用处于终止状态时,通过动态链接打开会导致崩溃。动态链接已被打印且不为空,但打开后出现半黑半红的空白屏。
处理动态链接的代码如下:
static Future<void> initDynamicLinks() async { try { // terminated state final PendingDynamicLinkData initLink = await FirebaseDynamicLinks.instance.getInitialLink(); if (initLink != null) { print('init link $initLink'); final Uri deeplink = initLink?.link; if (deeplink != null) { print('routing'); // routing(deeplink, deeplink.queryParameters); } else { print('deep link is null'); } } else { print('init link is null'); } } catch (e) { print('error getting link $e'); } // background and foreground states FirebaseDynamicLinks.instance.onLink.listen((dynamicLinkData) async { final Uri deeplink = dynamicLinkData.link; final queryParams = deeplink.queryParameters; if (deeplink != null) { routing(deeplink, queryParams); } else { print('listen link is null'); } }).onError((error) { print('onLink error'); print(error.message); }); }
注:routing是用于导航至指定路径的函数。
可能的原因及解决方案
导航时机过早:应用终止状态下,
initDynamicLinks可能在Flutter Widget树未完全初始化时就调用routing,导致导航上下文未就绪引发异常。
解决:将导航逻辑延迟到Widget树初始化完成后执行,比如使用WidgetsBinding.instance.addPostFrameCallback:if (deeplink != null) { print('routing'); WidgetsBinding.instance.addPostFrameCallback((_) { routing(deeplink, deeplink.queryParameters); }); }routing函数依赖资源未初始化:前台/后台状态下可用的资源(如Bloc、Provider实例)在终止状态下可能还未加载完成,直接调用routing会因资源缺失崩溃。
解决:检查routing中依赖的所有资源,确保导航前这些资源已初始化。可通过Future.wait等待必要资源加载完毕后再执行导航,或在导航前添加状态校验。路由路径未注册:动态链接解析后的路由路径未在应用路由表中定义,导致导航时找不到对应页面,出现空白屏。
解决:打印deeplink.path确认路径正确性,检查应用路由表是否包含该路径,确保所有动态链接对应的路由都已正确注册。原生端配置错误:终止状态下的动态链接处理依赖Android/iOS原生配置,比如Android的
AndroidManifest.xml中intent-filter配置错误,或iOS的Associated Domains、Info.plist配置缺失。
解决:核对Firebase官方文档的原生配置步骤,确保Android的intent-filter包含正确的scheme和host,iOS已添加动态链接域名到Associated Domains,且Info.plist中FirebaseDynamicLinksCustomDomains配置正确。
内容的提问来源于stack exchange,提问作者Ali Alqallaf

