# 小程序管理

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

# 1. 打开小程序

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

  1. 打开线上小程序,这里一般只需要小程序id和服务器地址即可,该api只能打开正式版和审核版的小程序。
  2. 二维码打开小程序,这个场景是扫描小程序平台上的二维码,得到二维码里的内容,然后使用该内容打开小程序。正式版、体验版、审核版、开发版、预览版本的小程序二维码都可以使用该Api打开。
  3. URL Scheme 打开小程序,这个场景是在H5网页里嵌入 URL Scheme 的URI,触发打开App里的小程序,只支持打开上架的正式版本小程序。

# 1.1 普通打开小程序

打开小程序时,会先判断本地是否有缓存的小程序,如果没有,则会自动从远程服务器上下载小程序,然后打开;如果有缓存的小程序,则会先打开本地小程序,然后再校验服务器端是否有新版本。

如果有新版本,则下载新版小程序,下次打开时,就会使用新版小程序;如果没有新版本,则什么也不做。

/// 启动小程序
/// @param request 启动的request
/// @param parentVC 父页面
/// @param completion 完成回调
/// @param closeCompletion 关闭小程序时的回调
- (void)startAppletWithRequest:(FATAppletRequest *)request
        InParentViewController:(UIViewController *)parentVC
                    completion:(void (^)(BOOL result, FATError *error))completion
               closeCompletion:(dispatch_block_t)closeCompletion;

FATAppletRequest

属性名 类型 描述
appletId NSString 小程序id,必填
apiServer NSString 小程序所属服务器,必填
appName NSString 小程序名称,非必填
appletLogo NSString 小程序图标的网络地址,非必填
startParams NSDictionary 小程序启动参数,支持的key,请参考FATStartParamKey,非必填
transitionStyle FATTranstionStyle 打开小程序时的转场动画方式,非必填,默认值为FATTranstionStyleUp
animated BOOL 是否使用动画,非必填,默认值为YES
sequence NSNumber 小程序索引, 非必填
offlineMiniprogramZipPath NSString 离线小程序压缩包路径,可传入一个本地小程序包路径,加快首次启动速度, 非必填
offlineFrameworkZipPath NSString 离线基础库压缩包路径,可传入一个基础库路径,加快首次启动速度, 非必填
schemes NSArray 自定义的scheme数组。 这里的配置项会覆盖FATConfig中的schemes.

注意:如果要首次离线启动,则offlineMiniprogramZipPath 和 offlineFrameworkZipPath必须都传递。

示例代码:

FATAppletRequest *request = [[FATAppletRequest alloc] init];
request.appletId = @"小程序id"; // 必填项
request.apiServer = @"服务器地址"; // 必填项
request.transitionStyle = FATTranstionStyleUp;
request.startParams =  @{
	@"path":@"/pages/index/index",
 	@"query":@"key1=value1&key2=value2",
 	@"scene" : @"1001"
}; // 小程序的启动参数
    
[[FATClient sharedClient] startAppletWithRequest:request InParentViewController:self completion:^(BOOL result, FATError *error) {
    NSLog(@"打开小程序:%@", error);
} closeCompletion:^{
    NSLog(@"关闭小程序");
}];

# 1.2 二维码打开小程序

这种情况流程一般会复杂一些,需要先扫描“人民网+”小程序开放平台上的二维码,得到二维码里的内容,然后使用二维码内容调用该接口打开小程序。

/// 二维码信息启动小程序
/// @param request 请求对象
/// @param parentVC 父页面
/// @param requestBlock 校验二维码的请求完成的回调
/// @param completion 完成的回调
/// @param closeCompletion 关闭小程序时的回调
- (void)startAppletWithQrCodeRequest:(FATAppletQrCodeRequest *)request
              inParentViewController:(UIViewController *)parentVC
                        requestBlock:(void (^)(BOOL result, FATError *error))requestBlock
                          completion:(void (^)(BOOL result, FATError *error))completion
                     closeCompletion:(dispatch_block_t)closeCompletion;

注意:打开体验版二维码时,需在初始化sdk时添加对应的体验成员userId。 FATAppletQrCodeRequest

属性名 类型 描述
qrCode NSString 二维码内容,必填
transitionStyle FATTranstionStyle 打开小程序时的转场动画方式,非必填,默认值为FATTranstionStyleUp
animated BOOL 是否使用动画,非必填,默认值为YES

示例代码:

FATAppletQrCodeRequest *qrcodeRequest = [[FATAppletQrCodeRequest alloc] init];
qrcodeRequest.qrCode = qrCode;

[[FATClient sharedClient] startAppletWithQrCodeRequest:qrcodeRequest inParentViewController:self requestBlock:^(BOOL result, FATError *error) {
    NSLog(@"请求完成:%@", error);
} completion:^(BOOL result, FATError *error) {
    NSLog(@"打开完成:%@", error);
} closeCompletion:^{
    NSLog(@"关闭");
}];

# 1.3 使用 URL Scheme 打开小程序

有些时候,我们希望能在safari加载的网页里或者其第三方app打开自己app中的小程序,这是用就可以使用URL Scheme来实现 通过自己的App打开小程序。

首先,需要添加URL Type。选择 Target -> 【Info】 -> 【URL Types】,新增一个URL Schemes。 URL Schemes的格式是fat+sdkKey的md5,见下图示例 URL Schemes的格式是fat+sdkKey的md5,见下图示例 URL Schemes的格式是fat+sdkKey的md5,见下图示例

image.jpg

然后,在AppDelagate 中实现 OpenURL代理方法。示例代码如下:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    if ([[FATClient sharedClient] handleOpenURL:url]) {
        return YES;
    }
    return YES;
}

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
    if ([[FATClient sharedClient] handleOpenURL:url]) {
        return YES;
    }
    return YES;
}

最后,在H5网页里添加Scheme 链接即可。链接的格式:fat{sdkKey的md5}://applet/appid/{小程序id}。 示例如下:

<a href='fat705b46f78820c7a8://applet/appid/5e017a61c21ecf0001343e31'>打开小程序</a>

当然,您也可以在safari浏览器的地址栏中输入完整的url(比如:fat705b46f78820c7a8://applet/appid/5e017a61c21ecf0001343e31),然后回车就会打开您的App,然后启动小程序了。

# 2. 关闭小程序

关闭小程序 等价于 点击右上角胶囊里的小程序,此时小程序是退至后台,小程序并未销毁。

# 2.1 关闭指定小程序

/**
关闭打开的指定小程序
@param animated 是否显示动画
@param completion 关闭完成的回调
*/
- (void)closeApplet:(NSString *)appletId animated:(BOOL)animated completion:(dispatch_block_t)completion;

# 2.2 关闭所有小程序

有些场景下,可能存在A小程序打开B小程序,B小程序打开C小程序的情况,这时想要关闭打开的所有小程序,可以使用该方法。

/**
关闭当前打开的所有小程序
@param completion 关闭完成的回调
*/
- (void)closeAllAppletsWithCompletion:(dispatch_block_t)completion;

# 2.3 关闭当前小程序

/**
关闭当前的小程序
@param animated 是否显示动画
@param completion 关闭完成的回调
*/
- (void)closeCurrentApplet:(BOOL)animated completion:(dispatch_block_t)completion;

# 3. 结束小程序

小程序被关闭后,并没有真的结束,而是在后台挂起。等下次打开小程序时,会立即将小程序切换至前台运行。 所以,如果我们希望小程序关闭后,真的被结束掉,可以根据实际情况使用以下API来结束指定小程序或所有小程序。

# 3.1 结束指定小程序

小程序关闭后,调用该api可删除缓存,即可销毁该小程序。

/**
删除内存中的指定小程序
*/
- (void)clearMemeryApplet:(NSString *)appletId;

# 3.2 结束所有小程序

当打开,关闭过多个小程序,想一次性将后台挂起的所有小程序都结束掉时,就可以使用该api。

/**
 清空内存中缓存的所有小程序
 */
- (void)clearMemoryCache;

# 4. 删除小程序

由于小程序的运行,会将小程序包和小程序信息缓存在本地,以后打开时会优先使用缓存,所以打开时速度也就会很快。 所以,如果想要将小程序的所有信息都删除,那么可以使用以下api删除某个小程序或者删除所有小程序。

# 4.1 删除指定小程序

/**
 从本地存储中删除指定小程序
 
 @param appletId 小程序id
 @return BOOL 结果
 */
- (BOOL)removeAppletFromLocalCache:(NSString *)appletId;

# 4.2 删除所有小程序

///  删除本地缓存的小程序
- (void)clearLocalApplets;

# 5 批量下载小程序

提前把小程序下载到本地,可以提高初次启动小程序的时间。

# API

/**
 @brief 批量更新小程序
 @param appIds 小程序id数组
 @param apiServer 服务器地址
 @param complete 批量更新小程序回调
 */
- (void)downloadApplets:(NSArray *)appIds apiServer:(NSString *)apiServer complete:(void (^)(NSArray *results, FATError *error))complete;
# 调用示例
[[FATClient sharedClient] downloadApplets:##appIds## apiServer:##apiServer## complete:^(NSArray *results, FATError *error) {
    // 批量更新小程序回调
    // results  批量更新小程序结果,是一个数组对象
    //          其中元素为:@{@"appId": ##小程序id##, @"success": ##更新是否成功##, @"needUpdate": ##是否需要更新##}
    //          每次传入的小程序id,有可能本地已缓存了最新的版本,故有可能无需更新,此时needUpdate字段为false
    // error    错误,成功时为nil
}];