作为追求代码洁癖的软件工程师,我们对“紧耦合”的技术实现可以说是深恶痛绝。要解决当前企业移动端App日益沉重、难以真正迭代、投入产出比低的问题,首先在技术架构上要实现真正的“松散耦合”。
那需要松散到什么程度呢?那就是是在一个相对稳定的App“内核”基础上,让绝大部分的应用功能(不管是因为创新需要、业务部门诉求等等而产生)必须可以(1)独立开发;(2)独立部署;(3)独立运维;(4)独立管理生命周期——随时上下架而不影响App主体。
App必须减重、瘦身、变成入口、合规可控对接互联网公共社交平台,通过这样的技术架构打造下一代超级APP,代表未来的方向。
App接入FinClip后,可能产生如下问题:
App是否能够实现“一对多”,即:1个App内能够打开多个不同环境、不同企业的小程序。 如:同时打开来自于企业A私有化环境下的小程序1、企业B私有化环境下的小程序2、企业C在凡泰SaaS环境下的小程序3App能否在不发版的前提下,动态管理小程序的展示、隐藏。如:当App在包含小程序1和2的情况下、已发布应用市场,此时再增加小程序3针对以上两个常见问题,我们整理了对应解决方案。
App实现“一对多”FinClip支持多服务器配置,此时所指的多服务器包括:
多个不同的部署环境(如企业A私有化环境、企业B私有化环境)多个不同企业的小程序(无论该小程序部署在什么环境上) #2.1 iOS 多服务器配置方式NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"servers" ofType:@"plist"];
NSArray *array = [NSArray arrayWithContentsOfFile:plistPath];
NSMutableArray *storeArrayM = [NSMutableArray array];
for (NSDictionary *dict in array) {
FATStoreConfig *storeConfig = [[FATStoreConfig alloc] init];
storeConfig.sdkKey = dict[@"sdkKey"];
storeConfig.sdkSecret = dict[@"sdkSecret"];
storeConfig.apiServer = dict[@"apiServer"];
storeConfig.apiPrefix = dict[@"apiPrefix"];
storeConfig.apmServer = dict[@"apmServer"];
if ([@"SM" isEqualToString:dict[@"cryptType"]]) {
storeConfig.cryptType = FATApiCryptTypeSM;
} else {
storeConfig.cryptType = FATApiCryptTypeMD5;
}
[storeArrayM addObject:storeConfig];
}
FATConfig *config = [FATConfig configWithStoreConfigs:storeArrayM];
[[FATClient sharedClient] initWithConfig:config error:nil];
#2.2 Android 多服务器配置方式
// 服务器信息集合
List storeConfigs = new ArrayList<>();
// 服务器1的信息
FinStoreConfig storeConfig1 = new FinStoreConfig(
"SDK Key信息", // SDK Key
"SDK Secret信息", // SDK Secret
"服务器1的地址", // 服务器地址
"服务器1的数据上报服务器地址", // 数据上报服务器地址
"/api/v1/mop/", // 服务器接口请求路由前缀
"", // SDK指纹
"加密方式" // 加密方式,国密:SM,md5: MD5
);
storeConfigs.add(storeConfig1);
// 服务器2的信息
FinStoreConfig storeConfig2 = new FinStoreConfig(
"SDK Key信息", // SDK Key
"SDK Secret信息", // SDK Secret
"服务器2的地址", // 服务器地址
"服务器2的数据上报服务器地址", // 数据上报服务器地址
"/api/v1/mop/", // 服务器接口请求路由前缀
"", // SDK指纹
"加密方式" // 加密方式,国密:SM,md5: MD5
);
storeConfigs.add(storeConfig2);
FinAppConfig config = new FinAppConfig.Builder()
.setFinStoreConfigs(storeConfigs) // 服务器信息集合
.build();
#3. App在不发版的前提下、动态管理小程序
App打开小程序实际是由两个步骤完成的:
使用SDK配置信息,完成SDK初始化使用AppID,打开指定小程序此时,如小程序均在同一个环境下,则SDK配置信息无需修改,仅通过动态管理的小程序列表页增加新的小程序入口(AppID)即可。此时,SDK初始化的节点可以放在App打开后、小程序打开前的任意时间点。
小程序列表页由App开发、维护,通常是小程序icon+文字,用户通过点击icon唤醒小程序。我们建议这个列表页使用可动态维护的框架进行开发,如H5页面。
当小程序不在同一个环境时,则需要从App后台(小程序列表页的管理后台)下发对应新的SDK初始化信息及小程序AppID信息。
整体业务流程如下,此时SDK初始化只能放在已获得不同小程序的配置信息后、小程序打开前。
我们将在后文,提供对应的代码示例,便利App开发者了解具体实现方式。
#3.1 iOS 配置方式#3.1.1 从服务器端获取服务器信息
App 从后台或其他途径获取服务器的配置信息。
#3.1.2 缓存该服务器的配置信息
这一步不是必要的。是否缓存看App获取配置是每次获取一个,还是获取所有的配置。如果每次获取一个服务器就需要缓存,如果每次获取所有服务器则没必要缓存,直接构造成配置对象初始化SDK即可。
#3.1.3 初始化SDK
// 构造一个服务器配置对象
FATStoreConfig *storeConfig = [[FATStoreConfig alloc] init];
storeConfig.sdkKey = @"SDK Key";
storeConfig.sdkSecret = @"SDK secret";
storeConfig.apiServer = @"服务器地址";
storeConfig.apmServer = @"apm 上报的服务器地址,不传默认使用apiServer";
storeConfig.cryptType = FATApiCryptTypeSM;
// 存到数组中
NSArray *configs = @[storeConfig];
// 将多套配置构造成一个config对象
FATConfig *config = [FATConfig configWithStoreConfigs:configs];
// 初始化SDK
[[FATClient sharedClient] initWithConfig:config error:nil];
#3.1.4 打开小程序
FATAppletRequest *request = [[FATAppletRequest alloc] init];
request.appletId = @"小程序id";
request.apiServer = @"服务器地址";
request.transitionStyle = FATTranstionStyleUp;
request.startParams = startParams;
[[FATClient sharedClient] startAppletWithRequest:request InParentViewController:self completion:^(BOOL result, FATError *error) {
NSLog(@"打开小程序:%@", error);
} closeCompletion:^{
NSLog(@"关闭小程序");
}];
#3.2 Android 多服务器配置方式
#3.2.1 动态获取服务器信息
App从后台或其它途径获取未在SDK初始化时配置的服务器信息。
FinStoreConfig storeConfig = new FinStoreConfig(
"SDK Key信息", // SDK Key
"SDK Secret信息", // SDK Secret
"服务器1的地址", // 服务器地址
"服务器1的数据上报服务器地址", // 数据上报服务器地址
"/api/v1/mop/", // 服务器接口请求路由前缀
"", // SDK指纹
"加密方式" // 加密方式,国密:SM,md5: MD5
);
#3.2.2 初始化新获取到的服务器信息
注意,若此时非第一次初始化SDK,即已在其它地方如Application中初始化过SDK,
则不能使用
new FinAppConfig.Builder()
的方式重新进行初始化,否则会丢失原有的SDK配置。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)