场景简介
当同时存在多个app需要集成sdk,且多个app需要使用同一个用户登陆时,如果每个应用都去做用户名密码认证,不仅体验不佳,且会占用多个授权,为了解决此场景,sdk提供了专门用于主从场景的接口,只需要主应用做用户名密码认证,子应用通过接口向主应用同步授权信息即可进行免密上线.如有需要参考MainApp的AppDelegate类。
前置步骤
在实际集成之前,我们要确保已经进行过开发准备
流程图
集成步骤
1、配置主从环境
SDK提供的拉起接口有前置条件:
- 主应用需要配置SFEasyApp.bundleId格式的URLScheme,用于从应用拉起,其中URLScheme是主应用的包名
2、实现主认证
参考典型场景用户密码主认证
3、注册子应用拉起回调事件
/**
* 注册拉起回调接口,当被子应用拉起时,会回调onAppLaunched函数
*/
[[[SFUemSDK sharedInstance] launch] setAppLaunchDelegate:self];
4、处理子应用拉起事件
从应用通过拉起接口拉起主应用时,会触发拉起回调,实现SFAppLaunchDelegate
协议,回调内部会传递从应用相关信息,在回调内实现授权相关UI
- (void)onAppLaunched:(SFLaunchInfo *)launchInfo {
self.launchInfo = launchInfo;
NSLog(@"Appdelegate onAppLaunched:%@", launchInfo);
//如果当前未认证,则退出此流程,等待认证成功后再跳回子应用
if ([[SFUemSDK sharedInstance].auth getAuthStatus] != SFAuthStatusAuthOk) {
NSLog(@"Appdelegate onAppLaunched: not auth ok");
[AlertUtil showAlert:@"当前未认证" message:@"请认证通过后再调用跳回子应用" completion:^{}];
//TODO 如果需要优化体验,可以当前主应用没有认证,可以暂存拉起信息,比如self.launchInfo,等到认证成功之后再通过此信息跳回子应用
return;
}
//当前主应用是已认证状态,可以直接拉起子应用
[self showAuthorizationAlert];
}
- (void)showAuthorizationAlert {
/**
* 检查子应用是否有被发布到控制台,如果检测失败,需要提醒管理员将子应用发布给此用户,这个接口判断也是为了优化体验,目的是能及时发现管理员配置错误。
*/
if ([[SFUemSDK sharedInstance].launch checkAppAuthorized:self.launchInfo.srcAppBundleId]) {
NSString *subAppName = self.launchInfo.srcAppName;
NSString *mainAppName = @"MainApp";
NSString *message = [NSString stringWithFormat:@"“%@”申请获取“%@”的网关登录信息,是否同意?", subAppName, mainAppName];;
//这里给个弹窗提醒用户要不要同意拉起子应用,目的是为了优化体验与安全性,您也可以不加弹窗,直接调用launchApp接口拉回子应用
[AlertUtil showAlert:nil message:message firstAction:@"拒绝" handler:^{
// 拒绝
self.launchInfo = nil;
} secondAction:@"同意" handler:^{
/**
* 拉起子应用进行授权登录认证
*/
[[SFUemSDK sharedInstance].launch launchApp:self.launchInfo.srcAppBundleId reason:SFLaunchReasonSubappAuthBack extraData:@"用户自定义数据"];
self.launchInfo = nil;
}];
} else {
[AlertUtil showAlert:nil message:[NSString stringWithFormat:@"无应用“%@”的使用权限,请联系管理员发布此应用", self.launchInfo.srcAppName]];
self.launchInfo = nil;
}
}
5、主应用主动拉起从应用的接口
subAppBundleId是从应用的bundleId,其中extraData可以传递用户自定义数据
[[SFUemSDK sharedInstance].launch launchApp:subAppBundleId reason:SFLaunchReasonSubappAuthBack extraData:@"用户自定义数据"]
6、体验优化逻辑
被子应用拉起后,如果是未登录,可以暂存拉起信息,待登录成功以后自动跳转到从应用
在onAppLaunched接口中先暂存被拉起的信息launchInfo,认证成功以后使用此信息跳转回子应用
/**
认证成功
*/
- (void)onAuthSuccess:(BaseMessage *)msg
{
NSLog(@"AuthViewController onLoginSuccess");
if (self.launchInfo) {
[[SFUemSDK sharedInstance].launch launchApp:self.launchInfo.srcAppBundleId reason:SFLaunchReasonSubappAuthBack extraData:nil];
self.launchInfo = nil;
}
}