前段时间接入了一键登录,里面的坑还不少,现梳理下来,为防止后期回顾及 避免以后的人能快速知道问题所在。

Android 接入文档:https://docs.geetest.com/onelogin/deploy/client/android

注意点:

1.版本问题

现在最新的版本是:

implementation 'com.geetest:onelogin:0.8.1'

我们使用的版本是 0.7.1,经测试发现此版本部分的电信号会不能使用一键登录,经测试大部分电信手机是好的,接入的期间,版本升级成了 0.8.0,修复了部分电信不能登录的问题。然后发现获取到​​authcode​​​后,后台验证不了,然后我们就回退到了​​0.7.1​​的版本。最新的0.8.1还未测试。

2.混淆

因为一键登录对电信的号经常有问题,再加上配置的Jenkins自动打包打的是debug的包,然后又忘了配置混淆,导致没有混淆就发了包,全部的电信号都登录不上了。

混淆规则:

-dontwarn com.geetest.onelogin.**
-keep class com.geetest.onelogin.** {
*;
}
-dontwarn com.cmic.sso.sdk.**
-keep class com.cmic.sso.sdk.** {
*;
}
-dontwarn com.unicom.xiaowo.login.**
-keep class com.unicom.xiaowo.login.** {
*;
}
-dontwarn cn.com.chinatelecom.account.**
-keep class cn.com.chinatelecom.account.** {
*;
}

3.提前初始化:

因为取号是耗时操作,所以需要提前初始化取号,不然点击登录按钮的时候会卡顿一会儿,那一会儿的时间就是要取号。且这样只初始化一次,如果无脑一直初始化取号会产生莫名其妙的问题。

private boolean isHavedInit = false;
public void oneLoginInit() {
if (!isHavedInit) {
isHavedInit = true;
OneLoginHelper.with().init(context);
oneLoginPreGetToken(false);
}
}

4.退出登录时 和 网络变化时 ,再次初始化取号

发生这两种情况时,人为判定是用户想要切换账号,所以再次取号:

public void onlyInit() {
if (!OneLoginHelper.with().isInitSuccess() && context != null) {
OneLoginHelper.with().init(context);
}
if (OneLoginHelper.with().isPreGetTokenSuccess() && !OneLoginHelper.with().isAccessCodeExpired()) {
} else {
//注意,如果提前预取号的话,为了避免还没结果之前再次回调被多次调用,需要判断预取号是否完成
//这里可以设计成当没完成预取号的话,按钮禁止点击等等。
//同时开发者对于提前预取号失败的话,也可以直接进行降级策略,比如收发短信等等。
if (!OneLoginHelper.with().isPreGetTokenComplete()) {
// Toast.makeText(context, "当前预取号还没成功", Toast.LENGTH_SHORT).show();
} else {
// 打开页面 不执行耗时操作
oneLoginPreGetToken(false);
}
}
}

5.通过一键登录,登录成功后的操作

oneLoginCancel();
OneLoginHelper.with().dismissAuthActivity();

/**
* 只有点击一键登录才执行这个
* 关闭 需在页面关闭时候调用
*/
public void oneLoginCancel() {
OneLoginHelper.with().cancel();
if (subscription != null) {
subscription.unsubscribe();
subscription = null;
}
}