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

iOS端Flutter应用重启后卡在启动页问题求助

iOS环境下Flutter Firebase应用重启/TestFlight安装后卡在启动页问题排查

问题现象

  • iPhone连接电脑运行Release模式时,应用正常启动,展示启动页后可进入首页或登录页面
  • 关闭/杀死应用后重新打开,或通过TestFlight下载安装的应用,会卡在启动页无法进入后续页面

排查方向

  1. Firebase初始化异常
    • 检查Firebase.initializeApp()在生产环境的异步执行是否阻塞,iOS无调试环境时可能存在初始化失败但未捕获的情况
    • 确认GoogleService-Info.plist是否正确打包到TestFlight版本中,路径是否匹配Xcode配置
  2. 权限请求时机错误
    • FirebaseMessaging.instance.requestPermission()在build方法中调用,可能阻塞UI线程,导致启动页无法跳转
  3. DevicePreview生产环境冲突
    • 生产环境保留builder: DevicePreview.appBuilder可能引发UI渲染异常,该工具仅适用于调试阶段
  4. 启动页面初始化逻辑阻塞
    • 检查MainBinding或HomeView中的异步操作(如网络请求、本地存储读取)是否未正确处理,导致页面无法加载
    • 确认initialRoute对应的页面是否存在未捕获的异常
  5. 日志定位问题
    • 通过Xcode连接设备,查看TestFlight版本的控制台输出或崩溃日志
    • 使用flutter logs命令获取应用重启后的运行日志

可能的解决方案

1. 调整权限请求时机

将权限请求移到main函数的异步初始化流程中,避免阻塞UI线程:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await Firebase.initializeApp();
  // 提前请求推送权限
  await FirebaseMessaging.instance.requestPermission();

  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);

  // ... 其他初始化代码

  runApp(MyApp());
}

2. 移除生产环境的DevicePreview

仅在调试模式启用DevicePreview:

return GetMaterialApp(
  // ... 其他配置
  builder: kDebugMode ? DevicePreview.appBuilder : null,
  // ... 其他配置
);

3. 检查初始化逻辑

  • 确认MainBinding中的依赖注入是否存在未处理的异步操作,可使用GetX的FutureProvider或async初始化方法
  • 检查HomeView的initState或初始化逻辑,确保所有异步操作都有错误捕获机制

4. 验证Firebase配置文件

  • 打开Xcode,确认GoogleService-Info.plist已添加到项目Target中
  • 检查Build Phases -> Copy Bundle Resources里是否包含该文件

相关代码与环境信息

主文件代码

import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:device_preview/device_preview.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:flutter_statusbarcolor_ns/flutter_statusbarcolor_ns.dart';
import 'package:get/get.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'app_colors.dart';
import 'home/home_view.dart';
import 'main_binding.dart';
import 'app_pages.dart';
import 'locales.dart';

const BASE_URL = "https://aaa.bbb.com/api/v1"; // prod

Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  await Firebase.initializeApp();
  print('Handling a background message ${message.messageId}');
}

const AndroidNotificationChannel channel = AndroidNotificationChannel(
  'notification_channel', // id
  'Machine Notifications', // title
  //'This channel is used for important machine notifications.', // description
  importance: Importance.high,
);

final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
    FlutterLocalNotificationsPlugin();

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await Firebase.initializeApp();

  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);

  await flutterLocalNotificationsPlugin
      .resolvePlatformSpecificImplementation<
          AndroidFlutterLocalNotificationsPlugin>()
      ?.createNotificationChannel(channel);

  await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
    alert: true,
    badge: true,
    sound: true,
  );

  String? tokenFBM = await FirebaseMessaging.instance.getToken();
  print(tokenFBM);
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    FlutterStatusbarcolor.setStatusBarColor(AppColors.primaryBlue);
    FlutterStatusbarcolor.setStatusBarWhiteForeground(true);
    FirebaseMessaging.instance.requestPermission();

    FirebaseMessaging.onMessage.listen((RemoteMessage message) {
      RemoteNotification? notification = message.notification;
      AndroidNotification? android = message.notification?.android;
      if (notification != null && android != null) {
        flutterLocalNotificationsPlugin.show(
            notification.hashCode,
            notification.title,
            notification.body,
            NotificationDetails(
              android: AndroidNotificationDetails(
                channel.id,
                channel.name,
                //channel.description,
                icon: 'ic_stat_notification',
                color: AppColors.primaryBlue,
              ),
            ));
      }
    });


    return GetMaterialApp(
      locale: Get.deviceLocale,
      builder: DevicePreview.appBuilder,
      initialBinding: MainBinding(),
      debugShowCheckedModeBanner: false,
      localizationsDelegates: [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        DefaultCupertinoLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: [
        const Locale('it', ''),
      ],
      translations: AppTranslation(),
      initialRoute: HomeView.ROUTE,
      fallbackLocale: Locale('it'),
      theme: ThemeData(
        primaryColor: AppColors.primaryBlue,
        backgroundColor: Colors.white,
        brightness: Brightness.light,
        textTheme: GoogleFonts.poppinsTextTheme(Theme.of(context).textTheme),
      ),
      getPages: AppPages.getRoutes(),
      title: 'Title',
    );
  }
}

flutter doctor 输出

Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.13.3, on macOS 13.1 22C65 darwin-arm64, locale en-GB)
[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.1)
[✓] Xcode - develop for iOS and macOS (Xcode 14.3.1)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2021.3)
[✓] Android Studio (version 2022.2)
[✓] Android Studio (version 2021.3)
[✓] IntelliJ IDEA Community Edition (version 2022.3.2)
[✓] VS Code (version 1.77.3)
[✓] Connected device (3 available)
[✓] Network resources

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 14:37:01