用户从Facebook授权返回后App启动异常崩溃求助
首先先看你提供的崩溃日志:
Crashed: com.apple.main-thread 0 libswiftCore.dylib 0x103c2faa4 swift_getObjectType + 60 1 0x102e3dc58 @objc AppDelegate.application(UIApplication, open : URL, sourceApplication : String?, annotation : Any) -> Bool (AppDelegate.swift) 2 0x102f5e730 -[FIRAuthAppDelegateProxy object:selector:application:openURL:sourceApplication:annotation:] + 4303562544 3 0x102f5d8e4 __47-[FIRAuthAppDelegateProxy initWithApplication:]_block_invoke.199 + 4303558884 4 0x102ee6aa0 -[FIRAAppDelegateProxy application:openURL:sourceApplication:annotation:] + 4303071904 5 UIKit 0x18e064acc __58-[UIApplication _applicationOpenURLAction:payload:origin:]_block_invoke + 880
从这个调用栈能看出几个关键信息:崩溃发生在主线程,触发点是swift_getObjectType——这个函数一般是Swift在尝试获取对象类型时,遇到了nil或者非法内存访问才会抛出崩溃。再结合调用链里的FIRAuthAppDelegateProxy,基本可以锁定问题和Firebase Auth处理Facebook授权的回调流程有关。
下面是几个最可能的原因和对应的解决方向:
Firebase Auth与Facebook登录的回调重复处理
如果你同时集成了Facebook SDK原生登录和Firebase Auth的Facebook登录模块,很可能出现回调被重复处理的情况。Firebase的FIRAuthAppDelegateProxy会自动接管AppDelegate里的application:openURL:sourceApplication:annotation:方法,要是你自己还手动实现了Facebook的回调逻辑,就可能导致对象状态异常,触发崩溃。
解决办法:移除你手动添加的Facebook回调代码,让Firebase代理来处理这个回调即可。回调方法里的强制解包操作
在AppDelegate.application(open:sourceApplication:annotation:)的OC桥接方法中,可能存在对可选类型的强制解包(比如用!)。当Facebook返回的参数里有nil值时(比如sourceApplication为空),直接强制解包就会触发崩溃。
解决办法:把所有可选参数的访问改成安全的可选绑定,比如:func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { guard let sourceApp = sourceApplication else { return false } // 这里写你的处理逻辑,确保不会访问nil对象 return true }Firebase SDK版本兼容性问题
旧版本的Firebase Auth SDK可能和最新的iOS系统、Facebook SDK存在兼容性问题,导致代理回调过程中出现内存错误或者类型不匹配。
解决办法:更新Firebase相关依赖到最新版本。打开你的Podfile,把Firebase的版本更新后,执行pod update Firebase/Auth即可。Firebase与Facebook的配置不匹配
要是你在Firebase控制台没正确配置Facebook的应用ID和密钥,或者Facebook开发者后台没添加正确的回调URL(包含Firebase的回调地址),也可能导致授权返回后回调处理异常。
解决办法:检查两边的配置,确保Facebook应用的回调URL包含https://<your-firebase-project-id>.firebaseapp.com/__/auth/handler,同时Firebase控制台的Facebook登录配置里填对了应用ID和密钥。
内容的提问来源于stack exchange,提问作者Utku Dalmaz

