场景简介

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

前置步骤

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

流程图

流程图

集成步骤

1、配置主从环境

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

  • 子应用需要配置SFEasyApp.bundleId格式的URLScheme,用于主应用授权后拉回子应用,bundleid为子应用的bundleId image-20220715215438886

  • 子应用需要配置主应用的URLScheme到子应用的LSApplicationQueriesSchemes白名单,用于判断主应用是否安装

image-20210604144220093

2、初始化SDK并监听回调

初始化SDK主要是完成SDK核心功能配置的初始化,只能放到didFinishLaunchingWithOptions函数中

注意: 1、SDK接口都需要在SDK初始化后才能调用,否则会抛出异常 2、flag的参数部分必须要指定对接vpn还是aTrust,否则主应用拉起子应用会存在异常

#import <SangforSDK/SFUemSDK.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    /**
     子应用需要保证Mode与主应用一致,同时flags必须包括SFSDKFlagsSubApplication
     */
    [[SFUemSDK sharedInstance] initSDK:SFSDKModeSupportVpnSandbox
                                 flags:SFSDKFlagsSubApplication | SFSDKFlagsSdpServer
                                 extra:nil];
    // 监听注销回调
    [[SFUemSDK sharedInstance] registerLogoutDelegate:self];
    // 监听拉起事件回调
    [[[SFUemSDK sharedInstance] launch] setAppLaunchDelegate:self];

    return YES;
}

3、子应用免密逻辑

子应用未登录或者注销时,需要拉起主应用进行授权,主应用授权后并通过拉起接口将子应用拉回来完成上线后,子应用才能正常使用。 建议在生命周期函数applicationDidBecomeActive:中调用自动免密接口,调用成功则可以直接进入应用,调用失败则需要拉起主应用授权后才能进入 拉起处理参考:


- (void)applicationDidBecomeActive:(UIApplication *)application {
    /**
     * 尝试使用自动免密上线
     */
    BOOL isReady = [[SFUemSDK sharedInstance] startAutoTicket];
    if (!isReady) {
        NSLog(@"start auto ticket failed.");
        // 调用失败需要拉起主应用授权
        [self launchMainApp];
    } else {
        // 调用成功,可以进入应用使用
        NSLog(@"start auto ticket success.");
    }
}

4、拉起主应用

launchApp接口详情

拉起主应用前建议判断主应用是否已安装,这样体验更好

/**
 * Demo 封装一个方法用来拉起主应用,方便使用
 */
- (void)launchMainApp {
    /**
     * 注意事项:
     * 1. 主应用需要配置格式为SFEasyApp.bundleId的URLScheme,用于拉起主应用
     * 2. 子应用如果需要判断主应用是否安装,配置主应用的URLScheme到LSApplicationQueriesSchemes白名单
     */
    NSString *mainAppBundleId = @"com.sangfor.sdktest";
    NSURL *mainAppOpenURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@.%@://", SFEASYAPP_PREFIX, mainAppBundleId]];

    // 判断主应用是否安装
    if ([[UIApplication sharedApplication] canOpenURL:mainAppOpenURL]) {
        NSLog(@"main app installed");
    } else {
        NSLog(@"main app uninstalled");
        [AlertUtil showAlert:@"主应用未安装" message:nil completion:^{
            exit(0);
        }];
    }

    [[[SFUemSDK sharedInstance] launch] launchApp:mainAppBundleId reason:SFLaunchReasonHostappAuthAuthorization extraData:nil];
}

5、实现代理协议

5.1、实现注销回调

在回调内部实现拉起主应用处理

#pragma mark - SFLogoutDelegate

- (void)onLogout:(SFLogoutType)type message:(SFBaseMessage *)msg
{
    NSLog(@"onLogout:%ld message:%@", type, msg);
    // 注销后子应用需要重新拉起主应用授权
    [self launchMainApp];
}

5.2、实现拉起事件回调

#pragma mark - SFAppLaunchDelegate
- (void)onAppLaunched:(SFLaunchInfo *)launchInfo
{
    //接收用户自定义数据
    NSLog(@"launchInfo.extra:%@", launchInfo.extraData);
    if ([[SFUemSDK sharedInstance] getAuthStatus] == SFAuthStatusAuthOk) {
        //可以进入业务界面并开始访问资源。
    } 
}

results matching ""

    No results matching ""