手把手第十一篇:将 FinClip SDK 引入自有应用

让我们一起看看如何在自有 App 中引入 FinClip SDK 进行集成。

手把手第十一篇:将 FinClip SDK 引入自有应用

在上期文章中,我们主要将 FinClip 与 mPaaS 和 Unisdk 进行了对比。本期文章中,我们将一起聊聊如何将 FinClip SDK 引入自有App。

本期文章属于《手把手系列教学》的第十一篇,如果你还不太了解这一系列,可以点击 这里 查看详情。

iOS 端

在 iOS 项目中引入 FinClip SDK 十分简单,参考如下步骤即可

第一步:获取 SDK KEY 及 SDK SECRET

使用 SDK 需要申请 SDK KEY 及 SDK SECRET ,只有在 SDK 初始化的时候配置了正确的 SDK KEY 及 SDK SECRET ,才能初始化成功并正常使用。

创建应用

注册用户需要登录「应用管理-新增合作应用」,完成应用创建

获取 SDK KEY 及 SDK SECRET

创建应用并添加 Bundle ID后,若需要导出对应的 SDK KEY 与 SDK SECRET,请选择对应 Bundle ID 后的「复制」,即可通过 ctrl+v或command+v 进行粘贴操作:

请注意:

  • SDK KEY:是合作应用能使用小程序 SDK 的凭证,如果 SDK Key 校验失败,则SDK 的所有 Api 都无法使用。
  • SDK SECERT:是访问服务的安全证书,不要给第三方。
关于创建应用与获取 SDK KEY 及 SDK SECRET 的详细操作,见「介绍-操作指引-企业端操作指引-7.关联移动应用」一节。

第二步:集成 SDK

这一步我们在前面的文章中已经有过介绍,可以参考 iOS 如何引入一个 SDK 这篇文章,来引入 FinApplet.frameworkFinAppletExt.framework

第三步:添加SDK头文件

在需要使用 FinClip 小程序 SDK 的地方,添加如下代码:

#import <FinApplet/FinApplet.h>

如果还集成了扩展 SDK,那么调用扩展 SDK 中的 api,还需要加上下面的代码:

#import  <FinAppletExt/FinAppletExt.h>

当然,最方便的方式是在 pch 文件中添加以上代码,这样在使用的地方就不用再引用了。

第四步:初始化 SDK

    FATConfig *config = [FATConfig configWithAppSecret:@"SDK KEY" appKey:@"SDK SECRET"];
    config.apiServer = @"https://www.finclip.com";
    [[FATClient sharedClient] initWithConfig:config error:nil];

第五步:打开小程序

    [[FATClient sharedClient] startRemoteApplet:@"app id" startParams:nil InParentViewController:self completion:^(BOOL result, NSError *error) {
        NSLog(@"result:%d---error:%@", result, error);
    }];

如果你想获取全部项目的示例 DEMO,可以点击下方下载。

Android 端

我们 Android 开发者应该都知道 Java 的口号,write once , run anywhere,而小程序平台可以 write once , run any miniprogram,小程序容器平台可以承载千万种各类的小程序 , 今天我们来研究下如何让自己App成为个容器,运行各类小程序。 这里借助 FinClip 平台完成这一项功能。

Android FinClip SDK 集成

在集成 SDK 前需要先到平台申请 SDK Key 和 Secret 的,并且把你的小程序代码包上传到平台上,获得小程序 appID,客户端需要通过这些信息来驱动小程序,参照上面的文档操作就行了, 这里不重复叙述。

FinClip SDK 集成前,需得到如下信息

  • SDK Key
  • SDK Secret
  • apiURL //小程序平台的url
  • appID // 小程序的appId

SDK 的集成主要由以下几步构成

第一步:添加依赖

在 root 工程的 build.gradle 文件里面添加 Maven 仓库

maven {
            url "https://gradle.finogeeks.club/repository/applet/"
            credentials {
                username "applet"
                password "123321"
            }
        }

随后,在 app module build.gradle 文件添加依赖

implementation 'com.finogeeks.lib:finapplet:2.34.5'

第二步:修改混淆配置,添加 FinClip 的混淆配置

在 App 的 proguard-rules.pro 文件里面添加混淆配置

-keep class com.finogeeks.** {*;}

第三步:初始化 FinClip SDK

建议放在 Application#onCreate 方法下去初始化 FinClip SDK,如下 APP_KEY,APP_SECRET 等字段是在 build.gradle 配置编译动态生成的

  • BuildConfig.APP_KEY   // Finclip SDK 的key 在平台上获取的
  • BuildConfig.APP_SECRET //Finclip SDK 的secret 在平台上获取的
  • FinAppConfig.ENCRYPTION_TYPE_SM // 加密类型
  • BuildConfig.API_URL //如果不是私有化部署默认填写 https://mp.finogeeks.com 这个就行了

        FinAppConfig config = new FinAppConfig.Builder()
                .setSdkKey(BuildConfig.APP_KEY)
                .setSdkSecret(BuildConfig.APP_SECRET)
                .setApiUrl(BuildConfig.API_URL)
                .setApiPrefix(BuildConfig.API_PREFIX)
                .setDebugMode(BuildConfig.DEBUG)
                .setEncryptionType(FinAppConfig.ENCRYPTION_TYPE_SM)
                .build();

        FinAppClient.INSTANCE.init(this, config, new FinCallback<Object>() {
            @Override
            public void onSuccess(Object result) {
                Toast.makeText(MopApplication.this, "SDK初始化成功", Toast.LENGTH_SHORT).show();
                // 注册自定义小程序API
                FinAppClient.INSTANCE.getExtensionApiManager().registerApi(new CustomApi(MopApplication.this));
                // 注册自定义H5 API
                FinAppClient.INSTANCE.getExtensionWebApiManager().registerApi(new CustomH5Api(MopApplication.this));
                // 设置IAppletHandler实现类
                FinAppClient.INSTANCE.setAppletHandler(new AppletHandler(getApplicationContext()));

                // 在主进程设置"小程序进程调用主进程"的处理方法
                // 开发者也可以选择在主进程其他合适的代码位置设置处理方法
                FinAppClient.INSTANCE.getAppletApiManager()
                        .setAppletProcessCallHandler(new IAppletApiManager.AppletProcessCallHandler() {
                            @Override
                            public void onAppletProcessCall(@NotNull String name,
                                                            @Nullable String params,
                                                            @Nullable FinCallback<String> callback) {
                                if (callback != null) {
                                    if (name.equals(LoginApi.API_NAME_LOGIN)) {
                                        // 从主进程获取登录信息,返回给小程序进程
                                        // 这里返回的是虚拟的用户登录信息,开发者请从APP里面自行获取用户登录信息
                                        JSONObject jsonObject = new JSONObject();
                                        try {
                                            jsonObject.put("userId", "123");
                                        } catch (JSONException e) {
                                            e.printStackTrace();
                                        }
                                        callback.onSuccess(jsonObject.toString());
                                    }
                                }
                            }
                        });
            }

            @Override
            public void onError(int code, String error) {
                Toast.makeText(MopApplication.this, "SDK初始化失败", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onProgress(int status, String error) {

            }
        });
defaultConfig {
        applicationId "com.finogeeks.finclip.demo"
        minSdkVersion 19
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

        multiDexEnabled true

        buildConfigField "String", "APP_KEY", "\"22LyZEib0gLTQdU3MUauATBwgfnTCJjdr7FCnywmAEM=\""
        // App Secret
        buildConfigField "String", "APP_SECRET", "\"bdfd76cae24d4313\""
        // API服务地址
        buildConfigField "String", "API_URL", "\"https://mp.finogeeks.com\""
        // API服务前缀
        buildConfigField "String", "API_PREFIX", "\"/api/v1/mop/\""

        ndk {
            abiFilters "x86", "armeabi", 'armeabi-v7a', 'arm64-v8a'
        }
    }

第四步:启动小程序

Map<String, String> params = new HashMap<>();
params.put("path", "pages/index/index");
String appId = "5fc8934aefb8c600019e9747";
FinAppClient.INSTANCE.getAppletApiManager().startApplet(MainActivity.this, appId, params);

注意事项

小程序是多进程设计,Application#onCreate 会多次初始化,建议添加如果代码,阻止小程序进程去初始化你其他的组件。

    @Override
    public void onCreate() {
        super.onCreate();

        if (FinAppClient.INSTANCE.isFinAppProcess(this)) {
            return;
        }
    }

由于 FinClip SDK 部分代码由 C++ 编写并且加固, 所以不能被压缩,需添加如下配置:

    packagingOptions {
        // libsdkcore.so是被加固过的,不能被压缩,否则加载动态库时会报错
        doNotStrip "*/x86/libsdkcore.so"
        doNotStrip "*/x86_64/libsdkcore.so"
        doNotStrip "*/armeabi/libsdkcore.so"
        doNotStrip "*/armeabi-v7a/libsdkcore.so"
        doNotStrip "*/arm64-v8a/libsdkcore.so"
    }

本期教程我们讨论了如何在自有 App 中引入 SDK。在下一期文章中,我们将会聊聊API 的相关使用,敬请期待。

可私有化的小程序生态管理系统 - FinClip

立即了解