场景简介

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

前置步骤

在实际集成之前,我们要确保已经进行过开发准备

流程图

流程图

集成步骤

1、配置主从环境

SDK提供的拉起接口有前置条件:

  • 主应用需要配置SFEasyApp.bundleId格式的URLScheme,用于从应用拉起,其中URLScheme是主应用的包名

image-20210604144220093

2、实现主认证

参考典型场景用户密码主认证

3、注册子应用拉起回调事件

    /**
     * 注册拉起回调接口,当被子应用拉起时,会回调onAppLaunched函数
     */
    [[[SFUemSDK sharedInstance] launch] setAppLaunchDelegate:self];

4、处理子应用拉起事件

launchApp接口详情

从应用通过拉起接口拉起主应用时,会触发拉起回调,实现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、主应用主动拉起从应用的接口

launchApp接口详情

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;
    }
}

results matching ""

    No results matching ""