威廉希尔williamhill|新闻和更新|
Android:通过谷歌登录和智能锁改善登录体验
有多少次你费尽心思登陆一个刚下载的应用?有多少次你注册了一个社交网络,一个流媒体服务或一个生产力工具,并发现他们也提供移动解决方案?
很多应用程序都提供了有吸引力的UI,甚至是在登录界面上,但实际的用户体验有点令人痛苦——但当你试图吸引和留住新用户时,它更有价值。
修复这个问题比你想象的要简单得多。谷歌已经为我们提供了两种改进应用程序登录体验的方法。
谷歌登录(以前称为谷歌+登录)
和SmartLock
大多数用户下载一个应用程序,并想要快速地与之互动——尤其是当它是一个生产力工具或某种社交网络时。
还有什么比让用户点击一下就登录更好的方式呢?
几乎每个Android用户都在设置过程中添加他/她的谷歌帐户。大多数时候,这是他们的主要电子邮件地址,也就是说,当他们注册各种服务时,这是他们使用的电子邮件地址。但通常情况下,人们倾向于在手机上添加更多的电子邮件和谷歌账户,例如:他们的工作邮箱。
我们可以利用这一点来简化登录过程。为了实现这个目标,我们将使用谷歌账户登录包,
编译“com.google.android.gms: play-services-auth: . x.x.x”
来自Play Services,其中包括谷歌登录API,以及SmartLock的证书API。为了满足本文的需要,我们还创建了一个演示应用程序Github。
因此,废话不多说,让我们深入了解一下实际的实现。
谷歌服务配置文件
要开始使用谷歌服务,我们首先需要创建一个配置文件。这个过程也被简化了,只要点击一下就可以下载。你可以在这里找到详细的说明。下载后,把它放在你的“app”文件夹中,你就可以使用它了。
谷歌登录
谷歌登录以前被称为谷歌+登录,那时谷歌要求每个新用户也创建一个谷歌+社交档案。
在谷歌放弃这一要求后,他们所有的服务都被重新标记为普通的“谷歌”,比如“谷歌登录”。
正如你在截图的底部看到的,这是重新命名的谷歌登录按钮提供了一个独立的谷歌视图。
谷歌登录按钮(XML)
现在我们已经添加了登录按钮,我们还需要在我们的活动中配置它。
私人lateinit var signInButton: signInButton覆盖有趣onCreate (savedInstanceState:包?){super.onCreate (savedInstanceState) setContentView (R.layout.activity_sign_in) initViews()}私人乐趣initViews () {signInButton = findViewById (R.id.sign_in_button) signInButton signInButton.setSize signInButton (SignInButton.SIZE_WIDE)。setOnClickListener {initiateGoogleSignIn()}}
谷歌登录按钮配置
我们还需要配置Googleapiclient,它将处理Google登录API和凭据API请求:
private fun initGoogleApiClient() {googleApiClient = googleApiClient . builder (this) . addconnectioncallbacks (this) . enableautomanage (this, this) . addapi (Auth. addapi)GOOGLE_SIGN_IN_API, googleesigninoptions) .addApi(Auth.CREDENTIALS_API) .build()}
Google API客户端初始配置
让我们来解释一下这几行代码的作用:
- AddConnectionCallbacks→使当前活动意识到googleapicclient连接生命周期。
- enableAutoManage→让GoogleApiClient“挂钩”当前的活动,以管理连接-断开操作基于活动的生命周期。
- addApi(身份验证。GOOGLE_SIGN_IN_API googleSignInOptions)→这里我们声明我们将使用谷歌登录API,使用我们已经创建的GoogleSignOptions。
- addApi (Auth.CREDENTIALS_API)→我们还将使用凭据API进行SmartLock,因此我们也宣布了这一点。
我们终于准备好继续正常的谷歌登录流程了。第一步是startActivityForResult当点击登录按钮时,带有登录意图:
private fun initiateGoogleSignIn() {val signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient) startActivityForResult(signInIntent, RC_SIGN_IN)}
启动谷歌登录
之后我们就可以处理结果了onActivityResult:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {super. override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)onActivityResult(requestCode, resultCode, data) when (requestCode) { RC_SIGN_IN -> handleGoogleSignInResolution(resultCode, data) } }
谷歌登录分辨率处理
我们现在可以处理谷歌登录的结果,以便更新我们的UI。根据结果,我们要么为用户登录,要么为他们呈现一个注册屏幕。所有这些案例都在本文附带的演示项目中详细实现。
SmartLock
SmartLock是一个强大的密码管理器,谷歌通过在Play Services中相同的谷歌帐户登录包提供。
但是,作为开发者和最终用户,SmartLock能为我们提供什么呢?
SmartLock使我们能够:
- 问用户保存他们的凭证。
- 请求那些凭证打开应用程序时。
- 使用保存凭据铬,如果我们宣布我们的网站和应用程序可以分享凭证。
- 显示电子邮件提示如果我们想在登录/注册过程中帮助用户。
- 最后,也是最重要的,以上所有的都是存储在谷歌的服务器和用户有完全的控制是什么保存/删除。
我们将在下面详细介绍所有这些情况,但如果您认为可能遗漏了什么,请确保检查Github上的演示项目。
1)要求用户保存他们的凭证
首先,我们检查以确保电子邮件地址和密码对于我们的业务逻辑是有效的(对于演示来说,这是一个快速实现),然后,我们创建凭证对象。最后,我们调用凭证API为了保存先前创建的凭证。下面,您可以看到它是如何呈现给用户的。
私人乐趣saveCredentials () {val emailInvalid:布尔= emailAddressTextInput.editText ? .text.toString () .trim () .isNullOrEmpty() ?:假val passwordInvalid:布尔= passwordTextInput.editText ? .text.toString () .trim () .isNullOrEmpty() ?:假如果(emailInvalid) {emailRequirementError()返回}如果(passwordInvalid) {passwordRequirementError()返回}val credentialToSave:.text.toString()) .build() Auth .CredentialsApi .save(googleApiClient, credentialToSave) .setResultCallback({result -> handleCredentialSaveResult(result)})}}
凭证保存的快速实现过程
证书是SmartLock域的关键元素。它包含与电子邮件地址相关的所有凭据信息(帐户类型或密码、姓名和头像URI)。凭据可以有帐户类型或密码。
我们还可以看到刚才保存的凭据是可用的passwords.google.com我们先前选定的电邮地址:
2)打开应用时请求凭据
在保存了上述凭证后,我们现在可以在打开应用程序时请求它们,以便自动登录用户,或给他们使用它们的能力,即时登录。
为了请求凭证我们需要创建一个CredentialRequest它指定了哪种凭证我们想要的。你可以声明凭证你想要包含一个密码,或者他们的类型是:谷歌,脸谱网,推特等。
private fun initSmartlockCredentialsRequest() {smartlockCredentialsRequest = CredentialRequest.Builder() .setPasswordLoginSupported(true) .build()}
SmartLock证书请求配置
创造了你的CredentialRequest对象,您将它传递给凭证API然后你处理结果:
私人乐趣请求围栏(){auth .credentialsapi .request(googleapiclient,smartlockCredentialSrequest).setresultcallback({credentialrequestresult - > handlecredentialRequestresult(credentialrequestresult)})}
请求的凭证
私人有趣的handlecredentialRequestresult(recentialRequestresult){if(credentialrequestresult.status.issuccess){caportunmains屏幕(credentialequestresult.credential.id)} else {resolvecredentialRequest(credentialrequestresult.status)}}
凭据请求结果处理
private fun resolveCredentialRequest(status: status?) {if (status?)commonstatuscodes == CommonStatusCodes.RESOLUTION_REQUIRED) {initiateCredentialRequestResolution(status)} else {credentialRequestFailure()}}
解决证书请求
private fun initiateCredentialRequestResolution(status: status?) {try {status?catch (sendintexception: intentsender . sendintexception) {credentialRequestResolutionFailure()}}
启动凭据请求的解析
你应该考虑的一件事,是凭证检索到的对象没有“电子邮件”字段。事实上,这封邮件是凭证被命名为“id”。另一件奇怪的事是,如果你要求凭证对于特定的帐户类型,您需要记住,它们将不包含密码,因为帐户类型和密码字段不能共存。
3)使用保存在Chrome上的凭据,如果我们声明我们的网站和应用程序可以共享凭据
用户凭证保存在铬对我们的案例来说也是非常有价值的。出色地,SmartLock提供了凭证之间的共享铬和Android应用程序。我们需要做的是:
-创建一个数字资产链接JSON文件(assetlinks.json) -将它上传到我们的服务器,在"/ "下。著名的/”目录
在这链接您可以找到如何创建的详细步骤数字资产的链接JSON文件,并将其添加到您的应用程序。
启用此集成的最后一步是填写一个隶属表格,通常需要2或3天才能接受。
在这一点上,我们要感谢史蒂文Soneff从谷歌的身份感谢他在这个过程中提供的宝贵帮助。
4)显示电子邮件提示,以便我们在登录/注册过程中帮助用户
当用户没有任何选项时,这是一个不错的备选方案凭证为我们的应用程序存储,我们可以显示一些电子邮件提示,以帮助用户选择电子邮件登录或者注册。
那么我们该怎么做呢?
它的步骤也差不多。
谷歌帐户登录api是相当相同的,这有助于我们轻松引导请求。
private fun initHintRequest() {hintRequest = hintRequest . builder () .setHintPickerConfig(CredentialPickerConfig.Builder() .setShowCancelButton(true) .setPrompt(CredentialPickerConfig.Prompt.SIGN_IN) .build()) .setEmailAddressIdentifierSupported(true) .build()}
邮件提示请求配置
让我们稍微解释一下这段代码:我们设置HintRequest为了支持电子邮件地址,我们还添加了一个HintPicker配置,它允许我们显示一个取消按钮,也有一个提示符作为对话框的标题。在本例中,我们选择显示登录提示符。谷歌也提供了一个注册提示。
然后,我们需要调用startIntentSenderForResult:
private fun requestEmailHints() {val intent = Auth.CredentialsApi。getHintPickerIntent(googleApiClient, hintRequest) try {startIntentSenderForResult(intentsender, RC_HINT_REQUEST, null, 0,0,0)} catch (e: intentsender . sendintexception) {emailHintRequestFailure()}}
请求邮件提示
接下来,我们处理结果:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {super. override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)onActivityResult(requestCode, resultCode, data) when (requestCode) { RC_HINT_REQUEST -> handleEmailHintRequestResolution(resultCode, data) } }
邮件提示请求结果
这个案例的结果包含凭证对象,包括用户选择的电子邮件地址:
private fun handleemailhinquestresolution (resultCode: Int, data: Intent?) {if (resultCode == appcompatiactivity . result_cancelled) {emailHintRequestCancelled()} else {emailHintRequestSuccess(data)}}
处理电子邮件提示请求解决
private fun emailHintRequestSuccess(data: Intent?) {val credentials: credential ?=数据? .getParcelableExtra (Credential.EXTRA_KEY)证书?。let {proceedonmain (.id)}}
邮件提示请求成功
结论
谷歌登录和SmartLock可能的结果也会产生大量的样板代码。
为了帮助您完成此任务,并让您将重点放在业务逻辑的工程流程上,我们创建了一个名为AuthManager.。AuthManager.处理上面描述的所有案例及其结果,同时提供流畅的API。AuthManager.还写100%在吗芬兰湾的科特林。
你可以找到GitHub上的AuthManager。
反馈和拉请求总是受欢迎的。