You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

退出登录后Google Sign-In的Safari模态窗口加载失败问题

退出登录后Google Sign-In的Safari模态窗口加载失败问题

嘿,这个问题我之前在项目里踩过一模一样的坑!退出已认证的用户后,再触发Google Sign-In,Safari里的GIDSignIn模态窗口死活加载不出认证页面,还弹个“safari can't open the page because the network connection was lost”的提示,当时差点头大。

先把问题场景和复现步骤理清楚,方便你对照:

问题描述:完成用户认证并执行退出操作后,再次尝试通过Google Sign-In登录时,Safari环境下的GIDSignIn模态窗口无法加载认证页面,提示网络连接丢失。

复现步骤

  • 以任意方式登录应用
  • 执行当前账户的退出操作
  • 再次触发Google Sign-In登录,触发上述错误

几个亲测有效的解决方向

  1. 彻底清理Google Sign-In的状态
    大部分情况都是退出流程没把Google的登录状态彻底清干净。别只清理你本地应用的用户会话,一定要调用Google Sign-In官方的退出方法:
    如果只是需要本地退出,用GIDSignIn.sharedInstance.signOut();如果要彻底断开应用和Google账户的关联,就用GIDSignIn.sharedInstance.disconnect()
    给你个Swift的示例代码参考:

    func handleAppSignOut() {
        // 先清理你自己应用的本地用户数据
        UserDefaults.standard.removeObject(forKey: "currentUserSession")
        // 再重置Google Sign-In的状态
        GIDSignIn.sharedInstance.signOut()
    }
    
  2. 处理Safari的隐私机制限制
    Safari的智能跟踪预防(ITP)经常会搞这种“网络连接丢失”的乌龙。你可以先排查:

    • 确保Google Cloud控制台里,已经把你的应用回调URL、域名都加进了白名单
    • 退出后如果有缓存残留,试试在退出流程里手动清理和Google相关的Cookie(不过这个操作要谨慎,别影响其他功能)
  3. 控制登录触发的时机
    别在退出操作刚执行完就立刻弹登录窗口!很多退出操作是异步的,得等Google的状态清理彻底完成后再触发登录。比如用回调或者延迟来确保:

    GIDSignIn.sharedInstance.signOut { error in
        if error == nil {
            // 确认状态清理完成后,再允许用户触发登录
            self.isSignInButtonEnabled = true
        }
    }
    
  4. 检查ATS配置
    去Info.plist里看看App Transport Security(ATS)的设置,别不小心把Google的认证域名给拦截了。默认ATS是允许的,但如果有自定义规则,要确保accounts.google.comoauth2.googleapis.com这些域名在允许列表里。

排查小技巧

可以打开Safari的开发者工具(连接真机后,在Mac的Safari偏好设置里开启开发者选项,就能看到连接的设备),盯着模态窗口的网络请求,看看是不是有实际的403/404错误,或者CORS问题,能帮你快速定位是状态没清干净还是网络层面的问题。另外也可以在Chrome里测测,如果只有Safari出问题,那基本就是Safari的隐私机制在搞鬼了。

备注:内容来源于stack exchange,提问作者Ye Park

火山引擎 最新活动