开发

性能优化

当前为宿主提供性能优化的手段有:

  • 预下载(宿主开发者维度);
  • 预取(宿主开发者维度);
  • 预连接(小程序开发者维度);

通过以上性能优化的手段,能快速打开小程序,提升用户体验。

一、预下载

通过预下载功能:提前下载好小程序包,预下载方式:

  • 通过调起协议接口;
  • 通过 appKey(一组 appKey )接口;

a、通过调起协议接口

  • 支持单个小程序的预下载
  • 一般用于feed列表等
1
2
3
4
5
6
7
8
9
10
11
12
13
接口:
/// @brief 通过调起协议,预下载小程序
/// @param scheme,小程序调起协议
/// @param callBack,小程序预下载完成的回调
+ (void)preDownloadAppPackageWithScheme:(NSString *)scheme
callBack:(void(^)(BOOL succeed))callBack;

/// 示例:以百度 app 上的小程序调起协议为例,调用预下载接口,scheme 协议,hostName://swan/appkey
[Pyramid.bba_MNP preDownloadAppPackageWithScheme:@"swandemo://swan/4fecoAqgCIUtzIyA4FAPgoyrc4oUc25c"callBack:^(BOOL succeed) {
if (succeed) {
NSLog(@"预下载小程序成功");
}
}];

b、通过 appKey 接口:

  • 支持单个或多个小程序的批量预下载
  • 一般用于个人中心等有批量预下载诉求的场景
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
接口:
/// @brief 通过 appKey,预下载小程序
/// @param appIDs,NSArray,要预下载小程序的 appkey 列表
/// @param appTypeString,业务包类型,@"swan":小程序,@"swangame":小游戏
/// @param scene,小程序场景值(以百度 APP 作为参考),表示小程序从哪个入口下载,如果不知道场景值,默认:BBASMAppPreDownloadSceneDefault
/// @param callBack,小程序预下载完成的回调
+ (void)preDownloadAppPackageWithAppIDs:(NSArray *)appIDs
appTypeString:(NSString *)appTypeString
scene:(BBASMAppPreDownloadScene)scene
callBack:(nullable void(^)(BOOL succeed))callBack;

/// 示例:调用预下载小程序接口
[Pyramid.bba_MNP preDownloadAppPackageWithAppIDs:@[@"4fecoAqgCIUtzIyA4FAPgoyrc4oUc25c"]
appTypeString:@"swan"
scene:BBASMAppPreDownloadSceneDefault
callBack:^(BOOL succeed) {
if (succeed) {
NSLog(@"预下载小程序成功");
}
}];

取消预下载小程序

1
2
3
4
5
6
7
接口:
/// @brief 取消预下载小程序
/// @param appID,小程序的 appKey
+ (void)cancelPreDownloadAppPackageWithAppID:(NSString *)appID

/// 示例:调用取消预下载小程序
[Pyramid.bba_MNP cancelPreDownloadAppPackageWithAppID:@"4fecoAqgCIUtzIyA4FAPgoyrc4oUc25c"];

判断是否已经下载小程序

1
2
3
4
5
6
7
接口:
/// @brief 判断是否已经下载小程序
/// @param appID,小程序的 appKey
+ (void)appHasPrefetchedWithAppID:(NSString *)appID

/// 示例:调用判断是否已经下载小程序接口
[Pyramid.bba_MNP appHasPrefetchedWithAppID:@"4fecoAqgCIUtzIyA4FAPgoyrc4oUc25c"];

二、预取

预取包含两个过程:预下载小程序和预加载小程序,默认小程序预加载队列只保留1个。提供预取的方式:

  • 通过 appKey 接口;( feed 场景)
  • 通过端能力;(搜索场景)

a、通过 appKey 接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
接口:
/// @brief appID 要预下载小程序的 appkey
/// @param appTypeString apptype
/// paramDic 业务包类型,{@"appKey":小程序 appKey,
/// @"state":(click、show、predownload),
/// @"schema":预下载协议,
/// @"scene":小程序场景值}
/// scene,小程序场景值(比百度 APP 作为参考),表示小程序从哪个入口下载,如果不知道场景值,默认:BBASMAppPreDownloadSceneDefault
/// callBack,小程序预取完成的回调
+ (void)preprocessSMWithAppID:(NSString *)appID
appTypeString:(NSString *)appTypeString
params:(NSDictionary *)paramDic
scene:(BBASMAppPreDownloadScene)scene
callBack:(nullable void(^)(BOOL succeed))callBack;

/// 示例:调用预取小程序接口
NSString *appId = @"4fecoAqgCIUtzIyA4FAPgoyrc4oUc25c";
NSString *scheme = [NSString stringWithFormat:@"swandemo://swanAPI/launch?params={\"appid\":%@}",appId];
NSDictionary *jsParam = @{@"appKey": appId,
@"state": @"predownload",
@"schema": scheme,
@"scene": @""
};
[Pyramid.bba_MNP preprocessSMWithAppID:appId
appTypeString:@"swan"
params:jsParam
scene:BBASMAppPreDownloadSceneFeed
callBack:^(BOOL succeed) {
if (succeed) {
NSLog(@"预取小程序成功");
}
}];

b、通过端能力

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
接口:
/// 构造 dispatcher,通过 dispatcher 转发协议
/// @brief 预取小程序端能力
/// @param dispatcher {"appKey":"TZzPY8qVvX97uzIH4L2SnY0g","state":"show","schema":"baiduboxapp://swanAPI/launch?params={"appid":"TZzPY8qVvX97uzIH4L2SnY0g"}}
- (void)prefetchAppData:(BBASchemeDispatcher *)dispatcher;

/// 示例:调用预取小程序端能力
NSString *appId = @"TZzPY8qVvX97uzIH4L2SnY0g";
NSString *scheme = [NSString stringWithFormat:@"swandemo://swanAPI/launch?params={\"appid\":%@}",appId];
NSDictionary *prefetchParams = @{@"appKey": appId,
@"state": @"predownload",
@"schema":scheme
};
NSString *paramsStr = [BBAJSONSerialization stringFromJSONObject:prefetchParams];
NSString *prefetchStr = [NSString stringWithFormat:@"swandemo://swanAPI/prefetchAppData?params=%@",[paramsStr bdp_encodeURIComponent]];
NSURL *prefetchAPPUrl = [NSURL URLWithString:prefetchStr];
BBASchemeDispatcher *dispatcher = [[BBASchemeDispatcher alloc] initWitheCommandURL:prefetchAPPUrl];
[dispatcher dispatchWithCompletionHandler:^(NSDictionary *response) {}];

三、预连接

预连接针对的是小程序开发者维度,进行性能优化,具体详见小程序开发者官方文档–prelink 预连接

四、性能优化文档

前端性能优化指导文档:https://smartprogram.baidu.com/docs/develop/performance/performance/