iOS端Flutter应用重启后卡在启动页问题求助
iOS环境下Flutter Firebase应用重启/TestFlight安装后卡在启动页问题排查
问题现象
- iPhone连接电脑运行Release模式时,应用正常启动,展示启动页后可进入首页或登录页面
- 关闭/杀死应用后重新打开,或通过TestFlight下载安装的应用,会卡在启动页无法进入后续页面
排查方向
- Firebase初始化异常
- 检查
Firebase.initializeApp()在生产环境的异步执行是否阻塞,iOS无调试环境时可能存在初始化失败但未捕获的情况 - 确认
GoogleService-Info.plist是否正确打包到TestFlight版本中,路径是否匹配Xcode配置
- 检查
- 权限请求时机错误
FirebaseMessaging.instance.requestPermission()在build方法中调用,可能阻塞UI线程,导致启动页无法跳转
- DevicePreview生产环境冲突
- 生产环境保留
builder: DevicePreview.appBuilder可能引发UI渲染异常,该工具仅适用于调试阶段
- 生产环境保留
- 启动页面初始化逻辑阻塞
- 检查
MainBinding或HomeView中的异步操作(如网络请求、本地存储读取)是否未正确处理,导致页面无法加载 - 确认
initialRoute对应的页面是否存在未捕获的异常
- 检查
- 日志定位问题
- 通过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
相关产品推荐
相关产品推荐

