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

Flutter Web/Android中FirebaseMessaging.requestPermission无响应求助

FirebaseMessaging.requestPermission()无响应,执行流程停滞的排查方案

问题描述

调用FirebaseMessaging的requestPermission()函数时,函数无任何返回,执行流程直接停滞。开发环境为Windows 11下的VSCode,Web端使用Edge浏览器测试,Android手机测试也未成功。控制台无任何错误输出,Web控制台也无报错。

相关代码

void initPushNotification() async {
    print("in async");
    String? fcmToken;
    try {
      final fcm = FirebaseMessaging.instance;
      print("requestperm");
      final response = await fcm.requestPermission();
      print(response.authorizationStatus.name);
      print("got perm");

      if (kIsWeb) {
        print("is web");

        fcmToken = await fcm.getToken(
            vapidKey:
                "A VAPID KEY HERE");
        print("got token");
      } else {
        fcmToken = await fcm.getToken();
      }
      print(
          fcmToken);
    } catch (err) {
      print(err);
    }
    print("end async");
  }

  @override
  void initState() {
    super.initState();
    print("initstate");
    try {
      initPushNotification();
    } catch (err) {
      print("catch");

      print(err);
    }
    print("finish initstate");
  }

控制台输出

initstate
in async
finish initstate
requestperm

pubspec依赖信息

environment:
  sdk: ^3.5.3


dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ^1.0.8
  firebase_core: ^3.6.0
  firebase_auth: ^5.3.1
  firebase_storage: ^12.3.4
  image_picker: ^1.1.2
  cloud_firestore: ^5.4.4
  firebase_messaging: ^15.1.4

dev_dependencies:
  flutter_test:
    sdk: flutter

  flutter_lints: ^4.0.0


flutter:
  uses-material-design: true

排查解决方案

  • Web端核心配置检查

    • 确认firebase-messaging-sw.js放置在web根目录(与index.html同级),不能嵌套子文件夹。
    • 检查service worker脚本内的Firebase配置,确保messagingSenderId与index.html中的配置完全匹配。
    • 手动确认Edge浏览器的通知权限:进入浏览器设置→隐私和安全性→网站权限→通知,确保当前测试域名的通知权限未被禁用。
  • Android端配置补全

    • 在android/app/src/main/AndroidManifest.xml中添加必要权限与配置:
      <uses-permission android:name="android.permission.INTERNET"/>
      <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
      <meta-data
          android:name="com.google.firebase.messaging.default_notification_channel_id"
          android:value="@string/default_notification_channel_id"/>
      
    • Android 13+必须创建通知渠道,可在初始化阶段添加如下代码:
      if (Platform.isAndroid) {
        const channel = AndroidNotificationChannel(
          'default_channel_id',
          'Default Notifications',
          description: '用于接收应用推送通知',
          importance: Importance.max,
        );
        final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
        await flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()?.createNotificationChannel(channel);
      }
      
    • 确认google-services.json已正确放置在android/app目录,且Firebase项目中已上传对应Android应用的SHA-1/SHA-256指纹。
  • 异步调用优化与错误捕获

    • 在initState中用WidgetsBinding.instance.addPostFrameCallback包裹异步函数调用,确保UI初始化完成后执行:
      @override
      void initState() {
        super.initState();
        print("initstate");
        WidgetsBinding.instance.addPostFrameCallback((_) {
          initPushNotification();
        });
        print("finish initstate");
      }
      
    • 给requestPermission添加超时处理,捕获隐性阻塞:
      final response = await fcm.requestPermission().timeout(
        const Duration(seconds: 10),
        onTimeout: () => throw TimeoutException('请求权限超时'),
      );
      
  • 依赖版本兼容性验证

    • 尝试同步升级firebase_core与firebase_messaging到最新稳定版,避免版本不兼容导致的隐性问题。
  • Firebase项目配置验证

    • 确认Firebase项目已启用Cloud Messaging服务,Web端使用的VAPID密钥是从Firebase控制台→项目设置→云消息传递→Web配置中生成的有效密钥。

内容的提问来源于stack exchange,提问作者Farkinox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 09:05:09