为啥我的 Flutter 应用在​​ iOS 上启动时会崩溃?

Posted

技术标签:

【中文标题】为啥我的 Flutter 应用在​​ iOS 上启动时会崩溃?【英文标题】:Why does my Flutter app crash at startup on iOS?为什么我的 Flutter 应用在​​ iOS 上启动时会崩溃? 【发布时间】:2020-08-18 03:51:18 【问题描述】:

我正在尝试使用 Flutter for iosandroid 构建一个简单的应用程序,但是当我尝试在 iPhone 上运行它时,该应用程序在启动时崩溃(Android 运行良好)。我没有 Mac,所以我使用 Codemagic 编译发布版本并部署到 TestFlight,然后从那里安装到​​ iPhone 上。据我所知,Apple 仅在 Xcode 中显示他们的崩溃日志(在线 App Store Connect 中没有?),而且由于我没有 Mac,所以我看不到这些。关于我可能会遇到什么问题,或者我可以收集哪些信息来调试问题的任何想法?

谢谢!

编辑:我一直在挖掘更多,看起来崩溃与 Firebase 依赖项有关。如果我创建 Flutter 演示项目(flutter create),它在 iOS 上运行良好。但是,如果我随后将 Firebase 包添加到 pubspec.yaml,并手动添加 GoogleServices-info.plist,则应用程序会在启动时崩溃。 (我还没有添加任何使用 Firebase 的代码。)GoogleServices-info.plist 应该与 Xcode 一起添加,但由于我没有 Xcode 或 mac,所以这很难。这个问题的第二个答案给出了一个建议:Where to save GoogleService-Info.plist in Flutter without Xcode? 我尝试进行这些更改,但得到了相同的结果。有没有人建议在没有 mac 的情况下添加 Firebase?

【问题讨论】:

【参考方案1】:

对于像我这样的新手,请确保在 ios/Runner/AppDelegate.swift 文件中注册 firebase 在 GeneratedPluginRegistrant 之前。

// This works without crashes, FirebaseApp.configure() after GeneratedPluginRegistrant crashes
FirebaseApp.configure()
GeneratedPluginRegistrant.register(with: self)

【讨论】:

这救了我的命。我真的不知道为什么文档没有明确说明这些东西的放置位置。 您能否更具体地了解文件名和粘贴位置 在 AppDelegate.swift 里面添加这两行: import Firebase FirebaseApp.configure() (above GeneratedPluginRegistrant.register(with: self)) 我没有 appDelegate.swift 我该怎么办【参考方案2】:

如果你在 Flutter 应用中使用 Google Firebase 库

确保在AppDelegate.swift 文件中在GeneratedPluginRegistrant.register(with: self) 之前使用FirebaseApp.configure()

FirebaseApp.configure()
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)

【讨论】:

【参考方案3】:

自最近几天以来我一直面临这个错误,今天我碰巧解决了它。因此,我想与任何在将 iOS 应用连接到 Firebase 后遇到启动错误的人分享它。

在使用 firebase 设置新的 iOS 应用程序时,我已按照所有步骤操作,而这正是导致错误的原因,就我而言。如果您在 AppDelegate.swift 中放置了 import 'Firebase' 和 Firebase.configure(),则将其删除并再次运行您的应用程序。我删除了这两行,它工作正常。使用 Cloud Firestore 对其进行测试(只需让一个按钮向您的 Cloud Firestore 写入内容)并确保在按下按钮时也添加 await Firebase.initializeApp();

我完成了所有这些步骤,并且效果很好。

附:我是在 Mac 上使用 android studio 完成的。

【讨论】:

【参考方案4】:

我遇到了同样的问题并解决了如下:

在flutter sdk的文件夹下, 我做了 git pull 然后再次运行该应用程序并解决了。

【讨论】:

【参考方案5】:

好的,这就是发生的事情。最初,该应用在 iOS 上崩溃是因为 GoogleServices-info.plist 文件(可能)存在问题。没有错误消息,所以我不知道在哪里看。我终于回到了简单的演示应用程序并开始重新分层以隔离问题。演示应用程序可以毫无问题地在 iOS 上构建和运行,但是当我添加 Firebase 依赖项(作为一个组)时,它失败了。我已经手动添加了 GoogleServices-info.plist 文件(在 Xcode 之外)并使用文本编辑器调整了 ios/Runner.xcodeproj/project.pbxproj 中的引用,但这并没有奏效。

在这一点上,我终于崩溃了,得到了一台 MacBook。在 Mac 上调试时,我现在可以看到应用程序在模拟器上的调试模式下以及在设备上的发布模式下崩溃,但仍然没有有用的错误消息。我使用 Xcode 添加了 GoogleServices-info.plist 文件,所以至少那部分是正确的,但应用程序仍然立即崩溃。翻阅文档后,我意识到在制作示例应用程序时,我忘记在 AdMob 的 info.plist 文件中添加应用程序 ID。此时只是 AdMob 导致了崩溃,而不是其他 Firebase 依赖项。我把它加回去了,一切都很好。我希望我在一个月前看过那个。呃。

感谢@Mikhail Tokharev 和@season 对如此含糊的问题提出质疑。我希望我最初能分享更多细节,但我知道的还不够多,不知道可能出了什么问题。

TL;DR

    只要买一台 Mac。尝试通过 Codemagic 进行调试是行不通的。 对于 Firebase,请确保您确实通过 Xcode 添加了 GoogleServices-info.plist 文件。尝试手动添加它并破解 project.pbxproj 文件可能不起作用(这是一个实用的建议,我没有最终证明这一点)。 https://firebase.google.com/docs/flutter/setup?platform=ios#add-config-file 对于 AdMob,请务必将您的应用程序 ID 添加到 info.plist。 https://pub.dev/packages/firebase_admob

【讨论】:

请删除您的第 4 点,这不是答案点。 :P 删除了我之前使用Android Studio添加的GoogleServices-info.plist,并使用Xcode再次添加,它启动良好但现在它不显示任何内容,只是一个白屏。 我根本没有使用 firebase 功能。但是我的应用程序在打开应用程序后立即崩溃。它从试飞中获得批准。从 testflight 下载并打开后,应用程序崩溃。我无法找到根本原因。有什么建议吗? 大声笑,我也一样。澄清一下,这是关于缺少这段代码的:<key>ADMOB_APP_ID</key><string>ca-app-pub-key</string> 只需添加此链接以进一步阐明 Asad 的观点,您应该如何添加 GoogleServices-info.plist,因为这是我的问题 firebase.flutter.dev/docs/installation/ios/…【参考方案6】:

我遇到了同样的问题,我已经修复了它,因为我是 ios 部署的新手代码

【讨论】:

好的,那是我没有做过的事情。 Firebase 需要哪些功能?我只是使用添加了 Firebase 依赖项的标准颤振演示应用程序,因此没有任何功能看起来适用。 是的,因为我使用的是 firebasemessaging 包...您需要添加推送通知和后台任务以及添加功能的最后 3 个选项...并遵循与 pub.dev/packages/firebase_messaging 相同的操作 好的,感谢您的提醒。我还没有使用 Firebase Messaging,但它在我的待办事项清单上可以查看。我一定会记住的。【参考方案7】:

您很可能已经遇到过下一个 Flutter 问题 https://github.com/flutter/flutter/issues/54707

【讨论】:

您好,谢谢您的建议!我尝试在 beta 分支 (1.17.0-3.4.pre) 和稳定分支 (1.17.0) 中使用最新版本进行编译,但都没有解决问题。当我在 iPhone 上运行该应用程序时,它仍然会立即崩溃。看起来这个bug同时影响Android和iOS?就我而言,只有 iOS 崩溃了。

以上是关于为啥我的 Flutter 应用在​​ iOS 上启动时会崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Flutter iOS 构建失败?

为啥在使用 Flutter 模块构建 iOS 原生应用时修复“Frameworks/Flutter.framework: Permission denied”?

为啥我的下载有时会使用 flutter_downloader 失败?

为啥我的 Flutter 应用程序在执行时没有构建?

为啥我的 Flutter 应用的列表视图滚动不如 Flutter Gallery 应用流畅?

为啥我的 Flutter 应用在​​ Android 上请求 Run on Startup 权限?