场景简介
当同时存在多个app需要集成sdk,且多个app需要使用同一个用户登陆时,如果每个应用都去做用户名密码认证,不仅体验不佳,且会占用多个授权,为了解决此场景,sdk提供了专门用于主从场景的接口,只需要主应用做用户名密码认证,子应用通过接口向主应用同步授权信息即可进行免密上线
前置步骤
流程图
集成步骤
1、实现主认证
参考典型场景用户名密码认证
2、监听被子应用拉起事件
注意:推荐放到application里面注册监听事件,避免注册时机过晚以及注册监听被销毁,可以参考SDKDemo的处理方法:在sdk初始化后就用一个单例对象注册拉起事件回调
示例代码如下:
SFUemSDK.getInstance().getSFLaunch().setAppLaunchListener(new SFLaunchEntry.SFAppLaunchListener() {
@Override
public void onAppLaunched(SFLaunchInfo launchInfo) {
SFLogN.info(TAG, "setAppLaunchListener onAppLaunched, launchInfo is :" + launchInfo);
});
3、处理被子应用拉起事件
示例代码如下:
@Override
public void onAppLaunched(SFLaunchInfo launchInfo) {
SFLogN.info(TAG, "setAppLaunchListener onAppLaunched, launchInfo is :" + launchInfo);
if (!SFLaunchEntry.isSubApp()) {
/**
* 只处子应用理申请授权拉起事件
*/
if (launchInfo.getLaunchReason() == SFLaunchReason.Launch_HOSTAPP_AUTH_AUTHORIZATION) {
/**
* 如果主应用当前是未认证成功状态,无法进行登陆授权,主应用需要先进行认证
*/
if (SFUemSDK.getInstance().getAuthStatus() != SFAuthStatus.AuthStatusAuthOk) {
Toast.makeText(mAppContext, "主应用尚未认证成功,请先认证", Toast.LENGTH_SHORT);
return;
}
/**
* 拉回到子应用进行授权
*/
SubAppManager.getInstance().launcherSubApp(mAppContext, launchInfo);
}
}
}
注意:出于安全考虑,在沙箱模式下主应用拉回子应用前使用这个接口判断一下子应用是否已经发布了
4、主应用主动拉起子应用
有些用户应用具备工作台的能力,即可以在主应用里面主动点击子应用图标拉起子应用,此时可以调用此接口,来拉起子应用,避免出现主动拉起子应用后,子应用还需要再次授权的问题
注意:如果没有主应用主动拉起子应用的需求,可以不使用此接口
示例代码如下:
// packageName是子应用的包名
SFUemSDK.getInstance().getSFLaunch().launchSubApp(context, packageName, SFLaunchReason.Launch_SUBAPP_ACTIVE, null);
5、主应用使用应用自定义的Intent拉起子应用
- 有些用户应用在集成SDK前已经有主从Intent传递数据功能,集成SDK后可以使用此接口传递用户的Intent,这样可以满足一次拉起同时传递原应用数据和SDK数据,且被拉起应用的原有处理逻辑不需要变动。
- 对于步骤4中处理被子应用拉起事件时,也可以使用此接口进行授权并传递用户Intent
注意:如果原应用集成SDK前无主从传递数据需求,可以不使用此接口
示例代码如下:
// packageName是子应用的包名, intent是原应用自定义拉起子应用的intent
SFUemSDK.getInstance().getSFLaunch().launchSubApp(context, intent, packageName, SFLaunchReason.Launch_SUBAPP_ACTIVE);