iOS实现Google Sign In时报错:无法将AppDelegate转为预期UIViewController类型
报错原因
GIDSignIn.sharedInstance.signIn方法的presenting参数要求传入UIViewController类型的实例,作为弹出谷歌登录授权页面的宿主容器。你当前将signIn方法写在了AppDelegate类中,传入的self是AppDelegate类型,和要求的参数类型不匹配,因此触发类型转换报错。
解决方案
根据你的实际使用场景二选一即可:
- 场景1:登录触发按钮是某个页面的UI控件
直接将整段signIn方法从AppDelegate移动到对应页面的UIViewController子类中即可,此时presenting参数传入的self是符合要求的视图控制器实例,报错会直接消除。
移动后的代码无需修改逻辑:@IBAction func signIn(sender: Any) { GIDSignIn.sharedInstance.signIn(with: signInConfig, presenting: self) { user, error in guard error == nil else { return } // 登录成功后跳转应用主内容页 } } - 场景2:确实需要在
AppDelegate中触发登录逻辑
先获取当前App顶层正在显示的视图控制器,再将该实例传给presenting参数即可。
示例代码如下:// 辅助方法:获取当前顶层显示的UIViewController func getTopViewController() -> UIViewController? { guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene, let rootViewController = windowScene.windows.first?.rootViewController else { return nil } var topVC = rootViewController while let presentedVC = topVC.presentedViewController { topVC = presentedVC } return topVC } // 修改后的signIn方法 @IBAction func signIn(sender: Any) { guard let topVC = getTopViewController() else { return } GIDSignIn.sharedInstance.signIn(with: signInConfig, presenting: topVC) { user, error in guard error == nil else { return } // 登录成功后跳转应用主内容页 } }
内容的提问来源于stack exchange,提问作者George Sepetadelis
相关产品推荐
相关产品推荐

