Flutter应用点击推送通知无法唤起App问题求助
Flutter推送通知无法唤起App(Android 13/14):sfmc_plugin + app_links 问题排查与修复
问题概述
使用sfmc_plugin处理推送通知、app_links(v6.0.2)实现深层链接的Flutter应用,此前点击推送可正常唤起App并跳转目标页面;近期出现异常:
- App后台暂停时,点击推送通知无反应
- 多次操作后跳转至应用内浏览器
- 手动打开App后,可正常通过深层链接跳转目标页面
测试环境:Android 13、Android 14,Flutter环境正常,推送Payload链接格式正确且行为设置为“打开App页面”
排查与修复方案
1. 检查Android 13+/14的权限与后台限制
- 通知权限:Android 13+需主动申请
POST_NOTIFICATIONS权限,确认App已获取该权限,可通过代码或系统设置验证:import 'package:permission_handler/permission_handler.dart'; Future<void> checkNotificationPermission() async { final status = await Permission.notification.request(); if (!status.isGranted) { // 引导用户开启权限 } } - 后台唤醒权限:部分国产厂商的后台管控会阻止App被推送唤起,需在系统设置中开启:
- 允许App「自启动」
- 允许App「后台活动」
- 关闭「电池优化」
2. 校验sfmc_plugin的通知点击回调逻辑
确认sfmc_plugin正确处理通知点击事件,尤其是App处于冷启动/后台杀死状态时的Intent传递:
- 确保初始化时注册了通知点击监听:
SfmcPlugin.onNotificationTap.listen((notification) { // 提取推送中的深层链接 final deeplink = notification.payload?['sfmc_deeplink']; if (deeplink != null) { // 直接触发导航,或传递给app_links处理 handleDeeplink(Uri.parse(deeplink)); } }); - 检查SFMC推送配置,确认Payload中深层链接字段(如
sfmc_deeplink)正确传递,且Intent启动模式设置为singleTop/singleTask,避免重复创建Activity。
3. 检查AndroidManifest.xml的深层链接配置
确保深层链接的Intent Filter配置正确,无冲突或遗漏:
<intent-filter android:autoVerify="true"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- 替换为你的自定义Scheme或App Links域名 --> <data android:scheme="your-app-scheme" /> <data android:host="your-host.com" /> </intent-filter>
- 若使用自定义Scheme,无需
android:autoVerify="true",但必须包含DEFAULT和BROWSABLE类别 - 检查SplashActivity(若有)是否正确将Intent传递给Flutter MainActivity,避免拦截推送唤起的Intent
4. 修复app_links的冷启动链接处理
app_links需同时处理冷启动和热启动的链接,确保初始化逻辑覆盖两种场景:
void main() async { WidgetsFlutterBinding.ensureInitialized(); final appLinks = AppLinks(); // 处理冷启动时的初始链接(App被推送唤起时触发) final initialLink = await appLinks.getInitialLink(); if (initialLink != null) { // 将链接存储到全局状态(如Provider、GetX),在MainTabManager中处理导航 GlobalState.setDeeplink(initialLink.uri); } // 处理热启动时的链接 appLinks.uriLinkStream.listen((uriData) { handleDeeplink(uriData.uri); }); runApp(MyApp()); }
- 在
MainTabManager的初始化逻辑中,检查全局状态的深层链接,若存在则直接跳转目标页面
5. 调试与验证步骤
- 用Android Studio Logcat过滤
Intent、sfmc关键词,查看点击推送时系统是否发送Intent,App是否接收 - 直接在浏览器输入自定义Scheme链接(如
your-app-scheme://target-page),验证是否能唤起App并跳转,排除深层链接本身问题 - 临时替换
sfmc_plugin为本地测试推送(如FCM),测试唤起逻辑是否正常,定位是否为SFMC配置问题
内容的提问来源于stack exchange,提问作者Patrick Mangubat
相关产品推荐
相关产品推荐

