Android上Google OneTap登录/注册弹出窗口显示延迟

xwbd5t1u  于 2022-12-02  发布在  Android
关注(0)|答案(1)|浏览(245)

我已经在我的应用程序中实现了Google Onetap SignIn。一切都运行正常,唯一的问题是,我观察到的是,在某些设备上,弹出窗口通常需要7-10秒才能显示。特别是在登录弹出窗口的情况下。
由于我在应用程序中有多个登录选项,因此可能会发生这样的情况,在我向用户显示他最后一次使用的谷歌帐户登录(通过OneTap弹出)之前,他有足够的时间点击任何其他选项(例如Facebook),这将成为一种糟糕的体验。
由于这个弹出窗口是由play-services显示的,我不知道如何优化这个时间。

contract
    .getOneTapClient()
    .beginSignIn(getSignInRequest(isRegistering))

是花费时间最多的一个。它似乎是查询用户在设备上的谷歌帐户的代码。
使用以下代码结构,添加以供参考

contract.getOneTapClient().beginSignIn(getSignInRequest(isRegistering))
            .addOnSuccessListener { result: BeginSignInResult ->
                try
                {
                    contract.startIntentSenderForResult(
                        result.pendingIntent.intentSender, requestCode,
                        null, 0, 0, 0, null)

                    successCallback?.onSuccess(isRegistering, "Rendering Popup")

                    val timeTaken = if(isRegistering) System.currentTimeMillis() - signUpTime
                    else System.currentTimeMillis() - signInTime
                    BBLogUtils.logWithTag(TAG, "Completed in ${timeTaken/1000.0}s")
                }
                catch (e: IntentSender.SendIntentException)
                {
                     failureCallback?.onFailure(isRegistering, e, ERROR_INTENT_SENDER_EXCEPTION)
                }
            }
            .addOnFailureListener { e: Exception ->
                // No saved credentials found.
                // OR Temporarily blocked due to too many canceled sign-in prompts.
                BBLogUtils.logWithTag(TAG, "Exception | registering=$isRegistering|rCount=$rCount | Error= ${e.message}")
                failureCallback?.onFailure(isRegistering, e, ERROR_NO_CREDENTIALS_FOUND)
            }

登录请求对象是文档规定的标准

private fun getSignInRequest(isRegistering: Boolean): BeginSignInRequest
    {
        return BeginSignInRequest.builder()
            .setGoogleIdTokenRequestOptions(BeginSignInRequest.GoogleIdTokenRequestOptions.builder()
                .setSupported(true) // So that we receive the idToken in result
                .setServerClientId(contract.getGoogleAndroidClientId())
                /*
                 * true: for Registration ie. showing all accounts
                 * false: for return user signIn, ie. showing only previously used accounts
                 **/
                .setFilterByAuthorizedAccounts(!isRegistering)
                .build())
            .build()
    }

另一个与此功能相关的问题是,在设备上首次启动应用程序时,我看到了这个额外的弹出窗口

有什么办法可以跳过这一步吗?

rslzwgfq

rslzwgfq1#

在这里回答我自己的问题的第二部分。
经过大量的搜索,我仍然无法找到一个跳过这个过程的解决方案。原来这个弹出窗口是播放服务的媒介,用于通知用户新的登录体验。
我发现如果我用Google Onetap安装了另一个应用程序(如Reddit或PIntrest),同样的弹出窗口也会出现在那里。而且,它只向用户显示一次,也就是说,如果弹出窗口在Reddit应用程序中显示,那么它不会出现在我的应用程序中,反之亦然。
此外,如果您不想重现此场景,可以清除Google Play服务的存储。在一段时间内,它可能会显示错误:16: App is not whitelisted,但过一会儿,您将再次看到How It Works弹出窗口。

相关问题