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

# 小程序管理

小程序管理主要介绍操作小程序的API,包括:打开小程序,关闭小程序,搜索小程序等。

# 1. 打开小程序

不同的场景,所使用的打开小程序的api也不同。所以,我们提供了多种不同的打开小程序的api。

  1. 打开线上小程序,这里一般只需要小程序id和服务器地址即可,该api只能打开正式版和审核版的小程序。
  2. 二维码打开小程序,这个场景是扫描小程序平台上的二维码,得到二维码里的内容,然后使用该内容打开小程序。正式版、体验版、审核版、开发版、预览版本的小程序二维码都可以使用该Api打开。
  3. 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))

小程序单进程模式运行时与多进程的不同

当小程序以单进程模式运行时

  1. 小程序将在主进程中运行,所有逻辑在主进程中执行,小程序页面将在主进程的页面栈打开,并跟随主进程的页面栈回到前台后台, 当关闭小程序时,小程序页面会被彻底关闭,再次打开需要重新启动

  2. 小程序自定义api只需要在主进程注册,并且也会在主进程执行,自定义api内与主进程交互不需要进行跨进程通讯。在小程序进程注册api的接口不应该再使用

  3. sdk暴露的工厂类,例如watermarkFactoryClass, offlinePackageFactoryClass, offlineAccountInfoClass将会跟随小程序在主进程中执行

  4. 自定义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) {
            //成功
            }
        }
);
© 2022 FinClip with ❤

👋🏻 嘿,你好!

「FinClip」是一套基于云原生框架设计的小程序容器。能够让任何移动应用在集成小程序SDK之后,获得可用、安全的小程序运行能力。

>> 点我免费注册体验

查看产品文档
了解与 FinClip 相关的一切信息

产品博客 👈  了解产品更新与核心功能介绍
资源下载 👈  获取小程序 SDK 与开发工具
文档中心 👈  查询 FinClip 小程序开发指南与答疑

商务咨询热线
预约 FinClip 产品介绍,咨询商务报价或私有化部署事宜

0755-86967467

获取产品帮助
联系 FinClip 技术顾问,获取产品资料或加入开发者社群

联系线上
人工客服

或 👉  点击这里,提交咨询工单