场景简介
当同时存在多个app需要集成sdk,且多个app需要使用同一个用户登陆时,如果每个应用都去做用户名密码认证,不仅体验不佳,且会占用多个授权,为了解决此场景,sdk提供了专门用于主从场景的接口,只需要主应用做用户名密码认证,子应用通过接口向主应用同步授权信息即可进行免密上线.如有需要参考MainApp的AppDelegate类。
前置步骤
在实际集成之前,我们要确保已经进行过开发准备
流程图
集成步骤
1、配置主从环境
SDK提供的拉起接口有前置条件:
子应用需要配置SFEasyApp.bundleId格式的URLScheme,用于主应用授权后拉回子应用,bundleid为子应用的bundleId
子应用需要配置主应用的URLScheme到子应用的LSApplicationQueriesSchemes白名单,用于判断主应用是否安装
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、拉起主应用
拉起主应用前建议判断主应用是否已安装,这样体验更好
/**
* 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) {
//可以进入业务界面并开始访问资源。
}
}