性能优化
当前为宿主提供性能优化的手段有:
- 预下载(宿主开发者维度);
- 预取(宿主开发者维度);
- 预连接(小程序开发者维度);
通过以上性能优化的手段,能快速打开小程序,提升用户体验。
一、预下载
通过预下载功能:提前下载好小程序包,预下载方式:
- 通过调起协议接口;
- 通过 appKey(一组 appKey )接口;
a、通过调起协议接口
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/