需求描述
最近项目上有个需求,要实现外部App跳转到自身App,并在自己App中实现免密登录功能。功能不算难,做个笔记,方便以后使用。功能分析
1、FirstApp提供SDK的jar包,SecondApp负责调用jar包中的toActivity方法
2、在toActivity方法中实现FirstApp提供的后台服务,验证SecondApp的合法性
3、接口请求成功后,实现SecondApp到FirstApp之间的跳转功能,并传值
4、FirstApp接收到SecondApp传来的值,进行登录校验代码实现
1、在SecondApp中引入AppBridge的jar包,并调用AppBridge中的toActivity方法
String env = EnvUtil.UAT; // 测试环境
AppBridge appBridge = new AppBridge(env);
appBridge.toActivity(MainActivity.this, "参数1","参数2", new BridgeCallback() {
@Override
public boolean success(String result) {
tv_response.setText(result);
return super.success(result);
}
@Override
public void fail(int code, String message) {
tv_response.setText(message);
}
});
2、进入AppBridge核心实现类,在此类中会请求一个服务接口,这个接口的作用是验证SecondApp的合法性,首先要提前将SecondApp的应用名、包名和证书的sha1值存储到FirstApp服务的数据库中,然后请求接口的时候将Second客户端的包名和证书的sha1值传到FirstApp的服务器验证,这里如果不是使用https请求,参数需要加密处理。
public class AppBridge {
private static final String TAG = AppBridge.class.getSimpleName();
private String env;
// 构造函数,将测试环境初始化
public AppBridge(String env) {
this.env = env;
}
/**
* 跳转到app,并传入相关参数
*
* @param context 上下文
* @param userName 用户名
* @param role 用户角色
* @param callback
*/
public void toActivity(final Context context, final String userName, final String role, final BridgeCallback callback) {
if (callback == null) {
return;
}
// 验证要跳转的app是否已经安装
if (!EnvUtil.isAPKExists(context, EnvUtil.getPackageName(env))) {
callback.fail(BridgeResponse.APP_NOT_EXISTS, "应用不存在.");
return;
}
// 验证SecondApp的证书是否能正常读取
String sign = EnvUtil.getSign(context);
if (sign == null) {
callback.fail(BridgeResponse.APP_SIGN_ERROR, "证书异常.");
return;
}
String params = "{\"InArgs\":{},\"XM\":{\"Sign\":\"" + sign
+ "\",\"PackageName\":\""