# App 跨服务器支持小程序常见问题
在接入 FinClip 小程序 SDK 后,您可能还有如下问题:
- 在一个 App 中,如何打开来自
FinClip SaaS 环境中
上架的多个小程序? - 在一个 App 中,如何打开来自
不同环境中(如自有环境与证联环境)
上架的多个小程序?
您可以在本文中,找到上述问题的答案与解决方法。
# 1. 小程序初始化与打开
在 App 中,对 FinClip 小程序 SDK 初始化,打开小程序的流程如下图所示:
通过上图 ② 与 ③ 步骤可知,初始化小程序 SDK
是打开小程序
的前序步骤。如果需要配置来自多个环境中的小程序,则需要在初始化小程序 SDK 前完成对应操作。
您也可以点击这里,查看如何设计小程序在 App 中的入口。
# 2. 在初始化 SDK 的过程中,如何配置多环境的服务器信息?
FinClip 支持在小程序初始化
过程中,配置来自多个环境
的小程序服务器信息,操作如下:
# 2.1 iOS 配置方式
注意
自2.13.109
版本开始,FinClip 小程序 SDK 支持配置多个服务器信息,可以同时打开多个不同服务器上的小程序,所以初始化方式有所变更,您可以按照如下示例初始化。
NSMutableArray *storeArrayM = [NSMutableArray array];
FATStoreConfig *storeConfig = [[FATStoreConfig alloc] init];
storeConfig.sdkKey = @"您的sdkKey信息";
storeConfig.sdkSecret = @"您的sdkSecret信息";
storeConfig.apiServer = @"服务器域名";
storeConfig.apmServer = @"apm统计事件的域名";
[storeArrayM addObject:storeConfig];
FATStoreConfig *storeConfig2 = [[FATStoreConfig alloc] init];
storeConfig2.sdkKey = @"您的sdkKey信息";
storeConfig2.sdkSecret = @"您的sdkSecret信息";
storeConfig2.apiServer = @"服务器域名";
storeConfig2.apmServer = @"apm统计事件的域名";
storeConfig2.cryptType = FATApiCryptTypeSM;
[storeArrayM addObject:storeConfig2];
FATConfig *config = [FATConfig configWithStoreConfigs:storeArrayM];
[[FATClient sharedClient] initWithConfig:config error:nil];
查看 iOS 具体初始化指引请点击这里。
# 2.2 Android 配置方式
// 服务器信息集合
List<FinStoreConfig> storeConfigs = new ArrayList<>();
// 服务器1的信息
FinStoreConfig storeConfig1 = new FinStoreConfig(
"SDK Key信息", // SDK Key
"SDK Secret信息", // SDK Secret
"服务器1的地址", // 服务器地址
"服务器1的数据上报服务器地址", // 数据上报服务器地址
"/api/v1/mop/", // 服务器接口请求路由前缀
"",
"加密方式" // 加密方式,国密:SM,md5: MD5(推荐)
);
storeConfigs.add(storeConfig1);
// 服务器2的信息
FinStoreConfig storeConfig2 = new FinStoreConfig(
"SDK Key信息", // SDK Key
"SDK Secret信息", // SDK Secret
"服务器2的地址", // 服务器地址
"服务器2的数据上报服务器地址", // 数据上报服务器地址
"/api/v1/mop/", // 服务器接口请求路由前缀
"",
"加密方式" // 加密方式,国密:SM,md5: MD5(推荐)
);
storeConfigs.add(storeConfig2);
FinAppConfig config = new FinAppConfig.Builder()
.setFinStoreConfigs(storeConfigs) // 服务器信息集合
.build();
查看 Android 具体初始化指引请点击这里。
# 3. 如何动态支持多个服务器上的小程序?我需要如何处理?
问:我已经完成了 SDK 关于服务器配置信息的初始化,但是后续又增加了服务器,我能做到不重新发布 App,就能打开新服务器上的小程序吗?
答:可以。需要后台提供一个获取多个服务器初始化配置信息的接口,然后在合适的时机调用这个接口,就可以拿到多个所有服务器的初始化配置信息,然后在初始化SDK,打开小程序即可。
你可以通过以下方式,重新初始化小程序 SDK
中的服务器信息。
# 3.1 iOS 端实现
# 3.1.1 获取所有服务器的初始化配置信息
这里需要后台维护多个服务器的初始化配置信息,然后提供接口给 App 在合适的时机调用。
# 3.1.2 初始化 SDK
// 假设这个array是从服务器获取的多个服务器的初始化配置信息。
NSArray *array = nil;
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.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];
# 3.1.3 打开小程序:
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 在合适的时机调用。
# 3.2.2 初始化SDK
请注意
如果此时并非首次初始化小程序 SDK(已在其它地方,如Application
中初始化过 SDK),则不能使用new FinAppConfig.Builder()
的方式重新进行初始化,否则会丢失原有的 SDK 服务器配置。
第一步,更新服务器配置信息:
// 获取之前的SDK配置
FinAppConfig finAppConfig = FinAppClient.INSTANCE.getFinAppConfig();
// 若此时是第一次初始化SDK,则可使用Builder的方式进行配置
// 若能够确保代码运行到此处时SDK已初始化过,则可省略掉该if代码块
if (finAppConfig == null) {
FinAppConfig.Builder builder = new FinAppConfig.Builder();
// builder.setXXXX 使用builder进行配置
finAppConfig = builder.build();
}
List<FinStoreConfig> finStoreConfigs = finAppConfig.getFinStoreConfigs();
// 添加之前动态获取到的服务器信息
finStoreConfigs.add(storeConfig);
// 重新进行SDK初始化
FinAppClient.INSTANCE.init(application, finAppConfig, new FinCallback<Object>() {
@Override
public void onSuccess(Object result) {
}
@Override
public void onError(int code, String error) {
}
@Override
public void onProgress(int status, String info) {
}
});
# 3.2.3 打开小程序
FinAppClient.INSTANCE.getAppletApiManager().startApplet(context, "apiServer", "appId", null, null);