Xcode 9.3-beta中Google登录按钮点击无响应问题求助
首先帮你拆解下控制台的两条警告,它们和你的Google登录问题完全无关:
Unknown class _TtC4LEAF14ViewController in Interface Builder file.:这是因为你的Storyboard/XIB里引用了一个已被删除或重命名的ViewController类(_TtC4LEAF14ViewController是Swift类的混淆名称)。你可以打开Storyboard检查所有控制器的自定义类设置,找到引用这个类的地方修正即可,不影响登录功能。Status bar could not find cached time string image. Rendering in-process.:这是iOS系统状态栏的渲染缓存警告,属于系统级问题,完全不需要处理。
接下来是核心问题:Google登录按钮点击无响应的原因和修复方案:
问题根源
你的代码里存在两个关键冲突点:
- 提前触发登录流程:在
registerViewController的viewDidLoad中,你主动调用了GIDSignIn.sharedInstance().signIn(),这会直接发起Google登录请求,导致按钮的默认点击事件被干扰(比如登录流程已经处于发起状态,后续点击按钮就不会有反应)。 - 重复实现代理方法:你同时在
AppDelegate和registerViewController里都实现了sign(_:didSignInFor:withError:)代理方法,这会导致登录回调逻辑混乱,甚至可能让正确的回调无法触发。
修复步骤
移除提前触发的登录调用
打开registerViewController的viewDidLoad方法,删掉GIDSignIn.sharedInstance().signIn()这一行:override func viewDidLoad() { super.viewDidLoad() GIDSignIn.sharedInstance().uiDelegate = self // 删掉下面这行 // GIDSignIn.sharedInstance().signIn() // Do any additional setup after loading the view. }统一代理实现
删掉registerViewController里的sign(_:didSignInFor:withError:)方法,因为AppDelegate已经实现了这个代理。如果需要在registerViewController里处理登录成功后的逻辑,可以用以下方式:- 通过
NotificationCenter发送通知,在AppDelegate的回调里通知registerViewController; - 或者把登录成功后的逻辑统一放在
AppDelegate里处理(比如跳转页面)。
- 通过
验证按钮绑定(可选)
如果你还是不确定按钮是否能接收点击事件,可以给按钮添加一个自定义点击事件测试:@IBAction func googleSignInTapped(_ sender: GIDSignInButton) { print("Google登录按钮被点击了!") GIDSignIn.sharedInstance().signIn() }然后在Storyboard里把按钮的
Touch Up Inside事件关联到这个方法,运行后点击按钮,如果控制台打印了日志,说明按钮没问题,问题已经解决。再次确认URL Types配置
虽然你说配置正确,但再核对一下:URL Types里的URL Scheme必须是com.googleusercontent.apps.你的ClientID,这个值可以从Firebase控制台的项目设置里获取,确保和FirebaseApp.app()?.options.clientID完全一致。
做完这些修改后,重新运行项目,Google登录按钮应该就能正常响应点击,弹出Google登录界面了。
内容的提问来源于stack exchange,提问作者Matthew Cheung

