You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter应用点击推送通知无法唤起App问题求助

问题概述

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 06:57:01