EXC_BAD_ACCESS 代码=2 在 Podfile 中包含 Firebase/Auth

Posted

技术标签:

【中文标题】EXC_BAD_ACCESS 代码=2 在 Podfile 中包含 Firebase/Auth【英文标题】:EXC_BAD_ACCESS code=2 on including Firebase/Auth in Podfile 【发布时间】:2016-10-28 11:48:32 【问题描述】:

在 Podfile 中包含“Firebase/Auth”后,我得到了 EXC_BAD_ACCESS。无需添加任何 firebase 代码行即可发生这种情况。我在 xcode 8 上使用 swift3,生成的 pod 是 -

Installing Firebase (3.8.0)
Installing FirebaseAnalytics (3.5.1)
Installing FirebaseAuth (3.0.6)
Installing FirebaseCore (3.4.4)
Installing FirebaseInstanceID (1.0.8)
Using GTMOAuth2 (1.1.4)
Using GTMSessionFetcher (1.1.7)
Using GoogleAppUtilities (1.1.2)
Installing GoogleInterchangeUtilities (1.2.2)
Using GoogleSignIn (4.0.1)
Using GoogleSymbolUtilities (1.1.2)
Installing GoogleToolboxForMac 2.1.0 (was 2.1.0)
Using Localize-Swift (1.6)
Using ProtocolBuffers-Swift (3.0.6)
Using QorumLogs (0.9)

错误出现在[UIViewController(FIRAScreenClassName) fira_viewDidAppear:]: 的线程 1 中

只有当 pod 目标本身是一个最终嵌入到应用程序中的框架时才会发生这种情况。

我也有谷歌分析。是因为没有启用ARC吗?我如何在 xcode-8 上做到这一点? 还有其他选择吗?

【问题讨论】:

我在更新谷歌登录框架后遇到了一些问题 我通过将 Google Framefork 降级到版本 2.0.4 来解决问题:pod 'Google/SignIn', '2.0.4' 您能否添加一些堆栈跟踪来帮助调试问题?谢谢 它进入了一个无限循环,调用 fira_viewDidAppear:,Google / FireBase 的一个类别。 【参考方案1】:

最新的 Firebase/Core (3.8.0) 版本似乎存在问题。甚至 @IBDesignable 也因递归调用您提到的方法签名而崩溃。

你有几个选择:

    在 Info.plist (app) 中,将 FirebaseAutomaticScreenReportingEnabled 设置为 NO (bool)。这解决了我正在运行的应用程序的问题,但 IBDesignable 资源在构建时导致了此错误:

file:///path/to/project/Base.lproj/Main.storyboard: error: IB Designables: Failed to render and update auto layout status for UIViewController (svZ-78-1Mn): The agent crashed

    例如,您可能希望暂时降级到 3.7.1,

    pod 'Firebase/Core', '~> 3.7.1'
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
    

当您运行 pod update 时,其余的依赖项应自行处理。

【讨论】:

@adarsh 我在 Firebase 支持方面花费了大量时间,试图解决这个问题。他们提供了一个我不满意的 hacky 解决方法(涉及调整链接器标志)——尽管应用程序会运行,但 Cocoapods 会抱怨并且单元测试构建不会编译。我终于尝试了一个带有 FB 依赖项的自定义 Cocoapod,但这似乎不受 Cocoapods 的支持(我在这里提交:github.com/CocoaPods/CocoaPods/issues/6138)。我的最终解决方案让我很痛苦,但我会直接将我的框架代码包含在 App 目标中,直到我们的问题得到合法修复为止。 我还应该补充一点——崩溃是因为@alex-d 的回答中提到的错误——“两者都实现”。清除该错误后,不再有崩溃。这就是 Firebase 支持建议手动修改链接器标志的原因。从技术上讲,它可以工作,但似乎太过分了,更不用说单元测试构建的破坏仍然没有得到解决。 他们怎么敢添加这样的功能“AutomaticScreenReporting”并默认设置为YES ????? 我只是讨厌所有在后台自动发生的神奇事情。当看不见的东西停止工作时,您就看不到出了什么问题。 这在 Firebase/Core 3.11.0 中仍然是一个问题【参考方案2】:

我犯了一个愚蠢的错误。从未在身份验证下打开 Google -> Firebase 上的登录方法

【讨论】:

【参考方案3】:

我怀疑 Podfile 不正确。我通过将 Firebase 依赖项添加到框架中遇到了类似的问题,我遇到了这样的问题

objc[12345]:FIRAAppEnvironmentUtil 类在两者中都实现 /Users/...Build/Products/Debug-iphonesimulator/SomeFramework.framework/SomeFramework (0x105ef7fc8) 和 /Users/.../CurrentProject.app/CurrentProject (0x105945108)。将使用两者之一。哪一个是未定义的。

正如post 中提到的,您可能在不同的目标中有重复的依赖项,这可能会导致像这样的奇怪错误。将 Firebase pod 添加到主要目标中并从框架中删除 Firebase pod 为我解决了这个问题。

【讨论】:

如果框架依赖于 pod,则 pod 必须在适当的目标中。仅将其包含在应用程序目标中是不够的。 我认为客户(应用程序)在使用框架时应该拉取 sdk 以避免复杂的依赖关系。根据这个github.com/jverkoey/ios-Framework/issues/46,似乎建议将sdk放在应用程序级别,而不是框架级别。

以上是关于EXC_BAD_ACCESS 代码=2 在 Podfile 中包含 Firebase/Auth的主要内容,如果未能解决你的问题,请参考以下文章

崩溃:“线程 1:EXC_BAD_ACCESS”?

Swift EXC_BAD_ACCESS,在协议扩展中定义了默认实现

聊天应用,分配问题。 Xcode 中的自定义类初始化错误(EXC_BAD_ACCESS 代码=2)

OSX EdsOpenSession exc_bad_access 上的佳能 EDSDK 2.11

Swift 运行时错误 (exc_bad_access) AVAudioRecorder, recordSettings

线程 1:EXC_BAD_ACCESS(代码=1,地址=0x48)