Flutter调用Firebase Auth时iOS端unrecognized selector崩溃排查
崩溃原因
崩溃由Info.plist配置类型错误直接引发:
- iOS 系统规定
NSAppTransportSecurity字段的值必须是字典(Dictionary)类型,但你的配置中错误将其设为了字符串类型:
<key>NSAppTransportSecurity</key> <string>for the video player to run</string>
- Firebase Auth依赖的GTMSessionFetcher网络库初始化时,会读取该字段,默认预期拿到字典对象,随后调用字典的
objectForKey:方法读取NSAllowsArbitraryLoads配置。由于实际拿到的是__NSCFString(字符串)类型实例,字符串没有objectForKey:方法,直接触发unrecognized selector sent to instance异常,导致应用崩溃,和你贴出的崩溃栈、代码触发点完全匹配。
修复步骤
- 修正NSAppTransportSecurity配置
删掉错误的字符串值,替换为合法的字典结构。如果不需要放开非HTTPS请求限制,使用如下配置即可:
如果视频播放等功能确实需要允许HTTP请求,将<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <false/> </dict>NSAllowsArbitraryLoads对应的值改为<true/>即可,注意所有ATS相关配置都必须写在这个字典内部,不能直接给NSAppTransportSecurity赋值字符串。 - 合并重复配置项
你当前的Info.plist存在多处重复键:重复的CFBundleURLTypes、重复的NSCameraUsageDescription、重复的NSMicrophoneUsageDescription。plist中重复键会被后写入的值覆盖,可能引发其他功能异常,需要合并:- 将Facebook、Google登录的URL Scheme统一放到同一个
CFBundleURLTypes数组中 - 删除重复的权限提示文案,仅保留实际需要对外展示的版本
- 将Facebook、Google登录的URL Scheme统一放到同一个
- 清理缓存重新编译
配置修改完成后执行以下命令清理构建缓存,再重新运行应用:flutter clean flutter pub get flutter run
内容的提问来源于stack exchange,提问作者dasKamel
相关产品推荐
相关产品推荐

