FinClip为企业提供小程序生态圈技术产品,开发者可在FinClip小程序开发帮助中心找到相关FinClip小程序指引

# 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);
© FinClip with ❤ , Since 2017