# 小程序管理
小程序管理主要介绍操作小程序的API,包括:打开小程序,关闭小程序,搜索小程序等。
# 1. 打开小程序
不同的场景,所使用的打开小程序的api也不同。所以,我们提供了多种不同的打开小程序的api。
- 打开线上小程序,这里一般只需要小程序id和服务器地址即可,该api只能打开正式版和审核版的小程序。
- 二维码打开小程序,这个场景是扫描小程序平台上的二维码,得到二维码里的内容,然后使用该内容打开小程序。正式版、体验版、审核版、开发版、预览版本的小程序二维码都可以使用该Api打开。
- URL Scheme 打开小程序,这个场景是在H5网页里嵌入 URL Scheme 的URI,触发打开App里的小程序,只支持打开上架的正式版本小程序。
# 1.1 普通打开小程序
打开小程序时,会先判断本地是否有缓存的小程序,如果没有,则会自动从远程服务器上下载小程序,然后打开;如果有缓存的小程序,则会先打开本地小程序,然后再校验服务器端是否有新版本。
如果有新版本,则下载新版小程序,下次打开时,就会使用新版小程序;如果没有新版本,则什么也不做。
# 1.1.1 普通打开小程序
# API
/**
* 通过参数封装对象来启动小程序
* @param request 参数封装,包括RemoteFinAppletRequest, QrCodeFinAppletRequest, LocalFinAppletRequest, DecryptFinAppletRequest,
* 建议使用IFinAppletRequest.fromAppId, IFinAppletRequest.fromQrCode, IFinAppletRequest.fromLocal, IFinAppletRequest.fromDecrypt等方法生成对应的request对象。
*/
fun startApplet(context: Context, request: IFinAppletRequest, callback: FinCallback<String>? = null)
# 调用示例
FinAppClient.appletApiManager.startApplet(
this,
IFinAppletRequest.fromAppId("apiServer", "appId")
)
FinAppClient.INSTANCE.getAppletApiManager().startApplet(
this,
IFinAppletRequest.Companion.fromAppId("apiServer", "appId"),
null
);
# 1.1.2 普通打开小程序时携带启动参数
# API
/**
* 通过参数封装对象来启动小程序
* @param request 参数封装,包括RemoteFinAppletRequest, QrCodeFinAppletRequest, LocalFinAppletRequest, DecryptFinAppletRequest,
* 建议使用IFinAppletRequest.fromAppId, IFinAppletRequest.fromQrCode, IFinAppletRequest.fromLocal, IFinAppletRequest.fromDecrypt等方法生成对应的request对象。
*/
fun startApplet(context: Context, request: IFinAppletRequest, callback: FinCallback<String>? = null)
通过传入RemoteFinAppletRequest对象,并通过setStartParams方法来设置启动参数。
# 调用示例
// path为小程序页面路径
// query为启动参数,内容为"key1=value1&key2=value2 ..."的形式
FinAppClient.appletApiManager.startApplet(
this,
IFinAppletRequest.fromAppId("apiServer", "appId")
.setStartParams(mapOf(
"path" to "/pages/index/index",
"query" to "aaa=test&bbb=123"
))
)
Map<String, String> params = new HashMap<>();
// path为小程序页面路径
params.put("path", "/pages/index/index");
// query为启动参数,内容为"key1=value1&key2=value2 ..."的形式
params.put("query", "aaa=test&bbb=123");
FinAppClient.INSTANCE.getAppletApiManager().startApplet(
this,
IFinAppletRequest.Companion.fromAppId("apiServer", "appId")
.setStartParams(params),
null
);
# 1.2 二维码打开小程序
扫描平台中的小程序二维码,将解析出来的小程序二维码内容传给接口打开小程序。
# API
/**
* 通过参数封装对象来启动小程序
* @param request 参数封装,包括RemoteFinAppletRequest, QrCodeFinAppletRequest, LocalFinAppletRequest, DecryptFinAppletRequest,
* 建议使用IFinAppletRequest.fromAppId, IFinAppletRequest.fromQrCode, IFinAppletRequest.fromLocal, IFinAppletRequest.fromDecrypt等方法生成对应的request对象。
*/
fun startApplet(context: Context, request: IFinAppletRequest, callback: FinCallback<String>? = null)
通过传入QrCodeFinAppletRequest对象,执行二维码打开小程序的操作。 注意:打开体验版二维码时,需在初始化sdk时添加对应的体验成员userId。
# 调用示例
FinAppClient.appletApiManager.startApplet(
this,
IFinAppletRequest.fromQrCode("qrCode"),
object : FinSimpleCallback<String>() {
override fun onSuccess(result: String) {
// 启动成功
}
override fun onError(code: Int, error: String?) {
// 启动失败
}
}
)
FinAppClient.INSTANCE.getAppletApiManager().startApplet(
this,
IFinAppletRequest.Companion.fromQrCode("qrCode"),
new FinSimpleCallback<String>() {
@Override
public void onSuccess(String result) {
// 启动成功
}
@Override
public void onError(int code, String error) {
// 启动失败
}
}
);
# 1.3 使用 URL Scheme 打开小程序
小程序支持通过URL Schema的方式打开,在浏览器或者其他应用中打开如"finapplet://applet/appid/xxxx"形式的链接可以打开小程序
其中 finapplet为默认的schema,在App中添加字符串资源
<string name="fin_applet_router_url_scheme">your schema</string>
可以替换默认的schema
url的全部内容为 schema://applet/appid/{appId}?path=xxx&query=xxx
其中{appId}为要打开的小程序id
?后面的部分为打开小程序的参数,参数是可选的,path为要打开的小程序路径,query为打开的参数,格式为a=1&b=2,因为path和query包含特殊字符,需要进行urlencode
# 1.4 以单进程模式打开小程序
小程序支持以单进程模式运行,配置的方式为在打开小程序时设置IFinAppletRequest的isSingleProcess属性为true
/**
* 设置是否通过单进程模式打开小程序
*/
fun setSingleProcess(isSingleProcess: Boolean): IFinAppletRequest
调用示例
FinAppClient.appletApiManager.startApplet(this,
IFinAppletRequest.fromAppId("xxxx")
.setSingleProcess(true))
小程序单进程模式运行时与多进程的不同
当小程序以单进程模式运行时
小程序将在主进程中运行,所有逻辑在主进程中执行,小程序页面将在主进程的页面栈打开,并跟随主进程的页面栈回到前台后台, 当关闭小程序时,小程序页面会被彻底关闭,再次打开需要重新启动
小程序自定义api只需要在主进程注册,并且也会在主进程执行,自定义api内与主进程交互不需要进行跨进程通讯。在小程序进程注册api的接口不应该再使用
sdk暴露的工厂类,例如watermarkFactoryClass, offlinePackageFactoryClass, offlineAccountInfoClass将会跟随小程序在主进程中执行
自定义api内获取到的context为小程序页面的context,可以直接跳转app的页面
# 2. 关闭小程序
由于SDK使用多进程的方式加载小程序,该API并不会真正结束小程序,而是将小程序移至系统后台。
# 2.1 关闭指定小程序
# API
/**
* 关闭小程序
*
* @param appId 小程序id
*/
fun closeApplet(appId: String)
# 调用示例
FinAppClient.appletApiManager.closeApplet("appId")
FinAppClient.INSTANCE.getAppletApiManager().closeApplet(appId);
# 2.2 关闭所有小程序
# API
/**
* 关闭所有小程序
*/
fun closeApplets()
# 调用示例
FinAppClient.appletApiManager.closeApplets()
FinAppClient.INSTANCE.getAppletApiManager().closeApplets();
# 3. 结束小程序
# 3.1 结束指定小程序
# API
/**
* 结束正在运行的小程序
*
* @param appId 小程序id
*/
fun finishRunningApplet(appId: String)
# 调用示例
FinAppClient.appletApiManager.finishRunningApplet("appId")
FinAppClient.INSTANCE.getAppletApiManager().finishRunningApplet("appId");
# 3.2 结束所有小程序
# API
/**
* 结束所有正在运行的小程序
*/
fun finishAllRunningApplets()
# 调用示例
FinAppClient.appletApiManager.finishAllRunningApplets()
FinAppClient.INSTANCE.getAppletApiManager().finishAllRunningApplets();
# 4. 删除小程序
由于会将小程序包和小程序信息缓存在本地,以后打开时速度会非常快。
所以,如果想要将小程序的所有信息都删除,那么可以调用以下api删除某个小程序或者删除所有小程序,删除的内容包括小程序本体、数据库、文件等。
# 4.1 删除指定小程序
# API
/**
* 移除使用过的小程序
*
* @param appId 小程序id
*/
fun removeUsedApplet(appId: String)
# 调用示例
FinAppClient.appletApiManager.removeUsedApplet("appId")
FinAppClient.INSTANCE.getAppletApiManager().removeUsedApplet("appId");
# 4.2 删除所有小程序
# API
/**
* 清除所有小程序相关数据(数据库、文件等)
*/
fun clearApplets()
# 调用示例
FinAppClient.appletApiManager.clearApplets()
FinAppClient.INSTANCE.getAppletApiManager().clearApplets();
# 5 批量下载小程序
提前把小程序下载到本地,可以提高初次启动小程序的时间。
# API
/**
* 批量下载小程序到本地
* @param context [Context]实例
* @param apiServer 小程序所在应用市场的服务器地址
* @param appIds 需要下载的小程序id数组
* @param callback 结果回调
* 注意:回调结果对象[AppletDownLoadInfo]字段
@param appId 被下载的小程序id
@param success 小程序是否获取成功
@param needUpdate 是否需要更新本地小程序 true:小程序来源于网络 ; false:小程序本地已经是最新版无需下载 (此字段只有 success 为 true 的时候才有意义)
*/
fun downloadApplets(context: Context ,apiServer:String ,appIds: List<String>,callback: FinSimpleCallback<List<AppletDownLoadInfo>>)
# 调用示例
val appIds = listOf("appId1","appId2")
FinAppClient.appletApiManager.downloadApplets(this, "apiServer", appIds, object :
FinSimpleCallback<List<AppletDownLoadInfo>>() {
override fun onError(code: Int, error: String?) {
//失败
}
override fun onSuccess(result: List<AppletDownLoadInfo>) {
//成功
}
})
List<String> appIds = Arrays.asList("appId1","appId2");
FinAppClient.INSTANCE.getAppletApiManager().downloadApplets(this, "apiServer", appIds,
new FinSimpleCallback<List<AppletDownLoadInfo>>() {
@Override
public void onError( int code, String error) {
//失败
}
@Override
public void onSuccess( List<AppletDownLoadInfo> result) {
//成功
}
}
);