场景简介
当同时存在多个app需要集成sdk,且多个app需要使用同一个用户登陆时,如果每个应用都去做用户名密码认证,不仅体验不佳,且会占用多个授权,为了解决此场景,sdk提供了专门用于主从场景的接口,只需要主应用做用户名密码认证,子应用通过接口向主应用同步授权信息即可进行免密上线
前置步骤
流程图

集成步骤
1、实现主认证
参考典型场景用户名密码认证
2、监听被子应用拉起事件
注意:推荐放到UIAbility里面注册监听事件,避免注册时机过晚以及注册监听被销毁,可以参考SDKDemo的处理方法:在sdk初始化后就用一个单例对象注册拉起事件回调
示例代码如下:
export default class EntryAbility extends UIAbility implements SFLaunchListener
onAppLaunched(launchInfo: SFLaunchInfo): void {
console.log("onAppLaunched with", JSON.stringify(launchInfo))
}
3、处理被子应用拉起事件
示例代码如下:
onAppLaunched(launchInfo: SFLaunchInfo): void {
console.log("onAppLaunched with", JSON.stringify(launchInfo))
this.handleBeLaunched(launchInfo)
}
private async handleBeLaunched(launchInfo: SFLaunchInfo) {
const authStatus = await SFUemSDK.getInstance().getSFAuth().getAuthStatus()
if (!authStatus) {
promptAction.showToast({
message: "当前未认证"
})
return;
}
const launch = SFUemSDK.getInstance().getSFLaunch()
const isAuthorized = launch.checkAppAuthorized(launchInfo.srcAppBundleId)
if (!isAuthorized) {
promptAction.showToast({
message: `无应用“${launchInfo.srcAppName}”的使用权限,请联系管理员发布此应用`
})
return
}
try {
const dialogResult = await promptAction.showDialog({
title: `“${launchInfo.srcAppName}”申请获取“SDKDemo”的网关登录信息,是否同意`,
buttons: [{
text: "取消", color: Color.Red.toString()
}, {
text: "确定", color: Color.Black.toString()
}]
})
if (dialogResult.index == 1) {
const reason = SFLaunchReason.SFLaunchReasonSubappAuthBack
const launchResult = await launch.launchApp(launchInfo.srcAppBundleId, reason, "")
console.log(`launch subApp ${launchInfo.srcAppBundleId} result ${launchResult}`)
}
} catch (e) {
console.error("弹框异常:", e);
}
}
注意:出于安全考虑,在沙箱模式下主应用拉回子应用前使用这个接口判断一下子应用是否已经发布了
4、主应用主动拉起子应用
有些用户应用具备工作台的能力,即可以在主应用里面主动点击子应用图标拉起子应用,此时可以调用此接口,来拉起子应用,避免出现主动拉起子应用后,子应用还需要再次授权的问题
注意:如果没有主应用主动拉起子应用的需求,可以不使用此接口
示例代码如下:
// launchInfo.srcAppBundleId是子应用的包名
const reason = SFLaunchReason.SFLaunchReasonSubappAuthBack
const launchResult = await launch.launchApp(launchInfo.srcAppBundleId, reason, "")
console.log(`launch subApp ${launchInfo.srcAppBundleId} result ${launchResult}`)