Shiply Harmony 远程资源 SDK 集成
一、隐私安全说明
Shiply 资源发布 Harmony SDK
版本:1.0.22
更新时间:2024年12月25日
SDK介绍:为移动开发者提供专业的资源分发能力,帮助开发者动态下载远程资源文件。
服务提供方:深圳市腾讯计算机系统有限公司
接入指引:《Shiply资源发布SDK接入指引》
隐私保护规则:《Shiply资源发布SDK个人信息保护规则》
合规使用指南:《Shiply资源SDK合规使用指南》
二、Harmony SDK 简介
Shiply Harmony 版本 SDK,支持在鸿蒙系统上进行远程配置下发、远程资源下发。
支持丰富的下发条件(允许自定义条件)
支持灰度发布、全量发布、定时发布
支持测试、验证、发布审批等流程
差量省流技术(iOS/Android 支持,鸿蒙版本后续支持)
三、 接入 Harmony SDK
步骤一、注册产品
在 Shiply 平台上注册产品,平台选择
Harmony
注册完成后,可以在设置-项目设置-常规-您的产品获取 APP ID 和 APP Key
步骤二、集成SDK
自动集成(推荐)
1、配置内网鸿蒙三方库,执行以下命令。(设置默认存在该三方库,则无需配置)
ohpm config set registry https://ohpm.openharmony.cn/ohpm/
提醒
设置默认原始只有鸿蒙官方三方库,如添加了其他三方库,需通过 ohpm config list
查看设置的三方库,手动将 https://ohpm.openharmony.cn/ohpm/
追加后重新设置。
2、通过 ohpm
安装 shiply 库。
ohpm install shiply@latest
ohpm install aki // 依赖 aki
3、安装完成后可直接在arkTs中通过 import
导入引用。
手动集成
1、通过三方仓库或其他渠道下载 shiply.har
三方SDK包。
2、在需要集成的模块下创建 libs
目录,将 shiply.har
放入目录。
3、在模块的 oh-package.json5
文件中添加对应 dependencies
,如下所示。
"dependencies": {
"@ohos/shiply": "file:../shiply",
"@ohos/aki": "^1.2.6" // 按需升级版本
}
步骤三、使用资源下发能力
初始化 SDK
import { ResHubParam, ResHubModel, ResHubError, ResHub } from '@ohos/shiply'
let param: ResHubParam = new ResHubParam();
param.appVersion = "1.0.0";
param.deviceType = "Macbook";
param.systemVersion = "13.2.1";
param.qimei = "59521F70-C388-486B-A6A5-22B903E6DACD";
param.isDebugPackage = false; // 是否为Debug包,设置为 true 可获取到未发布的资源,默认为 false(仅用于测试,请注意不要在线上版本设置true!!!)
param.callbackOnMainThread = true;
let context = getContext(this) as common.UIAbilityContext;
let filesDir = context.filesDir;
param.resConfigStoragePath = filesDir + "/reshub/mmkv"; // 资源的配置文件存储目录
param.resStoragePath = filesDir + "/reshub/resource"; // 资源文件存储目录
let levelLogCallback = (level: number, log: string) => {
// 需要打印到你的 App 日志中!
};
// AppKey 和 AppID 请前往 Shiply 网页端获取
// 正式环境 “online”,测试环境 “test”
ResHub.initResHubCenter(param, "95b84b2e2d", "c3fb420e-d3e4-4711-90ea-4cdb7a81ac16", "online", levelLogCallback);
this.initMessage = "初始化成功";
异步拉取资源(的锁定版本)
资源加载策略:
如果本地有该资源或对应的可用预置资源,优先读取加锁的,如果当前没有加锁,则同时加锁该资源,通过block直接返回,并异步静默更新资源
如果本地没有该资源或对应的可用预置资源,则等待网络请求资源后,锁定版本并返回
注意:
该方法在进程运行期间,多次调用返回的资源保证是同一个版本/// @param resId 资源id
/// @param progressBlock 进度的回调
/// @param completedBlock 完成的回调
let progressCalback = (progress: number) => {
}
let completionCallback = (success: Boolean, error: ResHubError, resModel: ResHubModel) => {
hilog.info(0x0000, 'ShiplyLog', 'resId=%{public}s md5=%{public}s', resModel.resId, resModel.md5);
}
ResHub.loadWithId(this.resId, progressCalback, completionCallback);
同步获取现有最新资源
同步获取现有最新资源, 不会进行网络请求
资源加载策略:
如果本地没有获取过该资源,且没有对应的可用预置资源,返回nil
如果本地有该资源或对应的可用预置资源,返回最新版本的资源
注意:由于本地资源可能被更新,该方法多次调用返回的资源不保证是同一个版本
如果需要在进程运行期间获取特定资源时使用同一版本,可使用带版本锁定的接口
该方法默认会校验资源文件是否正确(MD5校验),如果需要关闭,请调用latestResWithId:needValidate:方法
/// @param resId 资源id
let resModel: ResHubModel = ResHub.latestResWithId(this.resId, true);
异步拉取本地配置中远程最新资源
资源加载策略:
返回自动更新配置策略下,配置中最新的资源,即使本地有可用资源,也会根据最新配置,先尝试获取最新包
如果本次更新失败,回调失败结果,并返回本地最新包
注意:由于获取的是最新资源,该方法多次调用返回的资源不保证是同一个版本
如果需要在进程运行期间获取特定资源时使用同一版本,可使用带版本锁定的接口
此处的最新包和平台的最新包不一定匹配,会有一定的延时,因为当前配置是根据自动更新策略全量拉取的,所以本次如果命中配置缓存,则不能获取到平台上的最新资源。
如果需要拉取实时最新资源,请使用Realtime Latest相关接口/// @param resId 资源id
/// @param progressBlock 进度的回调
/// @param completedBlock 完成的回调
let progressCalback = (progress: number) => {
}
let completionCallback = (success: Boolean, error: ResHubError, resModel: ResHubModel) => {
hilog.info(0x0000, 'ShiplyLog', 'resId=%{public}s md5=%{public}s', resModel.resId, resModel.md5);
}
ResHub.loadLatestWithId(this.resId, progressCalback, completionCallback);
异步拉取远程实时最新资源
资源加载策略:
保证实时返回最新资源,即使本地有可用资源,也会先请求最新配置,再根据配置获取最新包
如果本次更新失败,回调失败结果,并返回本地最新包
注意:因为该接口一定会实时请求配置,频繁调用会大幅增加配置拉取成本,因此只应该对实时性要求非常高,要求必须拉到远端最新包的资源调用该接口
对实时性要求不太高,又希望更新的资源,请调用loadLatest(异步拉取多个本地配置中 远程最新资源)接口,该接口默认冷启动后,以及每三小时定时更新配置
由于获取的是最新资源,该方法多次调用返回的资源不保证是同一个版本
如果需要在进程运行期间获取特定资源时使用同一版本,可使用带版本锁定的接口
/// @param resId 资源id
/// @param progressBlock 进度的回调
/// @param completedBlock 完成的回调
let progressCalback = (progress: number) => {
}
let completionCallback = (success: Boolean, error: ResHubError, resModel: ResHubModel) => {
hilog.info(0x0000, 'ShiplyLog', 'resId=%{public}s md5=%{public}s', resModel.resId, resModel.md5);
}
ResHub.loadRealtimeLatestWithId(this.resId, progressCalback, completionCallback);
异步拉取资源的最新配置
配置加载策略:
该方法仅获取配置,不下载/更新资源
结果回调返回的资源中,本地存储路径信息为空
/// @param resId 资源id
/// @param completedBlock 完成的回调
let completionCallback = (success: Boolean, error: ResHubError, resModel: ResHubModel) => {
hilog.info(0x0000, 'ShiplyLog', 'resId=%{public}s md5=%{public}s', resModel.resId, resModel.md5);
}
ResHub.fetchResConfigWithId(this.resId, completionCallback);
删除本地指定id的资源
/// @param resId 资源id
ResHub.deleteWithId(this.resId);
清空本地所有资源
ResHub.deleteAll();