Google Plus 跨平台单点登录:onConnected 从未在全新安装中调用

Posted

技术标签:

【中文标题】Google Plus 跨平台单点登录:onConnected 从未在全新安装中调用【英文标题】:Google Plus Cross-Platform Single Sign-On: onConnected never called in a fresh install 【发布时间】:2014-05-14 03:59:01 【问题描述】:

我正在尝试在我的 android 应用中使用 Google Plus 实现“跨设备登录”。

如何实现这一点没有很好的文档,我找到的最好的文档是 github 中的this video、and these sample apps。

鉴于sample Android app和what the Google developers say in the video的代码,我知道会发生以下情况:

    我在设备 A 中安装并启动了该应用。该设备只有一个 Google 帐户,从未登录过该应用。

    onCreate() 将调用 PlusClient#connect()。由于用户从未在另一台设备上登录,我们将得到一个 onConnectionFailed()。

    如果用户点击登录按钮,我们将执行 mLastConnectionResult.startResolutionForResult(),这将执行一个 PendingIntent,向用户请求权限。

    现在我们用户已授予权限,对 PlusClient#connect() 的新调用将导致 onConnected()。

    现在,我们在设备 B 中安装应用程序。此设备只有一个 Google 帐户,与设备 B 相同。

    在 onCreate() 中,我们将启动 PlusClient#connect()

    由于同一个 Google 帐户之前在另一台设备上授予了相同的权限/范围集,因此将调用 onConnected()。

在前面的序列中,第 7 点没有发生。直接的联系永远不会发生。 确实,如果我执行 mLastConnectionResult.startResolutionForResult() 它将连接而无需再次询问相同的权限,但是如果刚刚安装了应用程序,则从 onCreate 触发的连接将导致 onConnectionFailed()。

我不确定我是不是弄错了,它不应该那样工作(但这是我从视频中了解到的),或者它只是没有按预期工作。

任何帮助将不胜感激。

谢谢。

注意事项: - 该应用程序已在 google play 开发者控制台中正确设置 - 我在两个不同的客户端中请求完全相同的范围,因为它实际上是同一个应用程序 - 两台设备只有一个 Google 帐户。 - 我正在使用 github 中的示例应用程序运行此实验

【问题讨论】:

【参考方案1】:

我也为此苦苦挣扎,结果发现跨平台 SSO 仅在您的应用第一次打开时检查(安装后首次运行)。清除 Google Play 服务的缓存和数据对我有用。

【讨论】:

谢谢!!!你是绝对正确的。我猜想 Google Play 服务中缓存了一些东西,阻止播放服务库访问 HTTP Google 服务器。多次开发和使用同一设备时,这种情况很可能会重现。【参考方案2】:

我不确定这里发生了什么。如果您点击登录按钮,系统会提示您重新同意,还是会自动登录? (出于诊断目的;您不需要这样做。)

跨设备 SSO 应该适用于 Android 到网络,反之亦然,也适用于 Android 到 Android。如果设备上有多个帐户,则无法避开帐户选择器,但此处似乎并非如此。

我刚刚使用https://github.com/googleplus/gplus-quickstart-android 的示例应用程序对此进行了测试,它似乎运行良好。在尝试其他任何东西之前,我还会确保一切都适用于 https://www.googleapis.com/auth/plus.login 范围。

【讨论】:

您好,感谢您的宝贵时间和帮助。我已尝试使用快速入门示例应用程序并获得与 github.com/googleplus/gplus-photohunt-client-android 的 Photohunt 应用程序和我的自定义应用程序相同的结果。请注意,PhotoHunt 使用旧的 PlusClient,而 QuickStart 应用程序使用较新的 GoogleApiClient。我已逐步遵循快速入门文档,我只请求 Plus.SCOPE_PLUS_LOGIN(代码没有更改)并且我在 Nexus7 设备中只有一个帐户。 一旦用户同意,如果登录按钮被按下,它不会提示重新同意:状态在谷歌的服务器中正确存储和检索,用户不需要两次相同一组权限。但是,如果我将应用程序安装在具有相同帐户的另一台设备上,第一次调用 connect() 时,它将始终以 onConnectionFailed() 结束。【参考方案3】:

为了进一步澄清,以下是我从谷歌得到的关于这个问题的回复:

跨设备单点登录 (CDSSO) 每个应用仅运行一次 设备,如你所说。这是一项昂贵的操作(迭代 设备上的所有帐户),通常不会产生任何新结果 第一次运行后。

您有几个选项可以让您的用户无缝登录 卸载/重新安装后的体验:

为密码使用 Smartlock,专为此类事情而设计。您可以将用户的标识符存储在 Smartlock 中,然后即使在用户获得全新设备时也能获得非接触式登录体验。 将用户的 google 帐户存储在某处,然后在 GoogleSignInOptions 上调用 setAccount()。如果用户之前使用该帐户登录过,这将使静默登录工作。

【讨论】:

以上是关于Google Plus 跨平台单点登录:onConnected 从未在全新安装中调用的主要内容,如果未能解决你的问题,请参考以下文章

自定义 Google Plus 登录按钮和 Facebook 登录按钮

应用在 Play 商店发布后,Google plus 登录和 Google 地图无法使用

Android Google Plus 登录问题。 handleSignInResult 返回 False

iOS sdk 中的 Google Plus 登录按钮框架

Google 使用 g-plus 最新 API 在 android 中登录和注销

无法使用 Google Plus 登录,出现 com.google.android.gms.common.api.ApiException: 10: