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

集成步骤
1、实现主认证
参考典型场景用户名密码认证
2、声明被子应用拉起的url scheme
在module.json5文件中中对应处理子应用拉起的ability中的skills标签中声明scheme协议,可以参考Demo,用于子应用调用SDK接口拉起主应用进行授权,里面的scheme是固定的,但host应用填用户当前应用的包名
"uris": [
{
"scheme": "SFEasyApp",
"host": "com.sangfor.sdkdemo"
}
]
3、监听被子应用拉起事件
注意:推荐放到UIAbility里面注册监听事件,避免注册时机过晚以及注册监听被销毁,可以参考SDKDemo的处理方法
示例代码如下:
export default class EntryAbility extends UIAbility implements SFLaunchListener
onAppLaunched(launchInfo: SFLaunchInfo): void {
console.log("onAppLaunched with", JSON.stringify(launchInfo))
}
4、处理被子应用拉起事件
示例代码如下:
onAppLaunched(launchInfo: SFLaunchInfo): void {
console.log("onAppLaunched with", JSON.stringify(launchInfo))
this.handleBeLaunched(launchInfo)
}
private async handleBeLaunched(launchInfo: SFLaunchInfo) {
const isOnlineStatus = await SFUemSDK.getInstance().getSFAuth().getAuthStatus()
if (!isOnlineStatus) {
promptAction.showToast({
message: "主应用尚未认证成功,请先认证"
})
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 launch = SFUemSDK.getInstance().getSFLaunch()
const launchResult = await launch.launchApp(launchInfo.srcAppBundleId, reason, "")
console.log(`launch subApp ${launchInfo.srcAppBundleId} result ${launchResult}`)
}
} catch (e) {
console.error("弹框异常:", e);
}
}
5、主应用主动拉起子应用
有些用户应用具备工作台的能力,即可以在主应用里面主动点击子应用图标拉起子应用,此时可以调用此接口,来拉起子应用,避免出现主动拉起子应用后,子应用还需要再次授权的问题
注意:如果没有主应用主动拉起子应用的需求,可以不使用此接口
示例代码如下:
// launchInfo.srcAppBundleId是子应用的包名
const reason = SFLaunchReason.SFLaunchReasonSubappAuthBack
const launchResult = await launch.launchApp(launchInfo.srcAppBundleId, reason, "")
console.log(`launch subApp ${launchInfo.srcAppBundleId} result ${launchResult}`)