手把手第十一篇:将 FinClip SDK 引入自有应用
让我们一起看看如何在自有 App 中引入 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.framework 和FinAppletExt.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 的集成主要由以下几步构成
- 获取最新的SDK 版本
- 添加依赖
- 修改混淆配置,添加 FinClip 的混淆配置
- 初始化 FinClip 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 的相关使用,敬请期待。