集成Firebase Google登录时openURL方法未调用问题求助
我来帮你排查这个棘手的登录问题!这种情况大概率是URL配置或者委托方法的问题,咱们一步步来定位解决:
1. 优先检查URL Scheme配置是否正确
这是最常见的触发原因——你的App没有正确配置Google登录需要的URL Scheme,导致跳转后无法回调回来。
- 打开项目的
Info.plist文件,找到(或者添加)URL types条目 - 在
URL types下的Item 0里,添加URL Schemes数组,把你GoogleService-Info.plist文件中的REVERSED_CLIENT_ID值粘贴进去 - 注意:一定要完全复制这个反转的客户端ID,不能有拼写错误,包括开头的
com.googleusercontent.apps.前缀
2. 确认URL回调方法的实现覆盖所有iOS版本
iOS 13之后苹果引入了SceneDelegate,如果你用了Scene模式,只在AppDelegate里实现iOS9+的方法是不够的:
对于iOS 13+(SceneDelegate)
在SceneDelegate.swift中添加以下方法:
@available(iOS 13.0, *) func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) { guard let url = URLContexts.first?.url else { return } // 处理Google登录的URL回调 GIDSignIn.sharedInstance().handle(url) }
对于iOS 12及以下(AppDelegate)
保留你现有的方法,但要确保没有其他逻辑错误导致返回false:
@available(iOS 9.0, *) func application(_ application: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool { return GIDSignIn.sharedInstance().handle(url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String, annotation: [:]) }
提示:如果你的项目同时支持两种模式,两个方法都要实现哦
3. 验证GoogleSignIn的初始化是否正确
确保在App启动时正确配置了GIDSignIn,建议在AppDelegate的didFinishLaunchingWithOptions里做这件事:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 初始化Firebase FirebaseApp.configure() // 用Firebase的clientID配置GoogleSignIn guard let clientID = FirebaseApp.app()?.options.clientID else { print("Failed to get Firebase client ID") return true } let config = GIDConfiguration(clientID: clientID) GIDSignIn.sharedInstance.configuration = config return true }
不要手动硬编码clientID,直接从FirebaseApp里取能避免错误
4. 检查ATS(App Transport Security)设置
确保你的ATS配置没有阻止Google登录相关的域名访问,默认情况下ATS是允许的,但如果你自定义了ATS规则,需要添加google.com及其子域名到例外列表中:
在Info.plist里添加NSAppTransportSecurity -> NSExceptionDomains -> google.com,开启NSIncludesSubdomains(后者NSExceptionAllowsInsecureHTTPLoads现在基本不需要,因为Google全站HTTPS,但加上更保险)
5. 用真实设备测试
有时候模拟器的SafariViewController会有一些奇怪的缓存或权限问题,建议拿真实的iOS设备测试,看看问题是否依然存在
按照这个步骤排查下来,应该能解决SafariViewController突然关闭且回调方法不触发的问题啦!
内容的提问来源于stack exchange,提问作者Akaanksha




