目录
- 前言
- 跨应用数据共享的重要性
- HarmonyOS的数据共享能力
- 相关的基本概念
- 跨应用数据共享的数据管理
- 具体实现跨应用数据共享
- 延伸:数据共享的安全和隐私
- 结语
前言
现在的移动操作系统中,应用之间的数据共享已成为提升用户体验和实现功能互补的重要手段,尤其是在移动端开发中,关于数据存储和数据共享是重中之重的事情。而HarmonyOS作为华为推出的新一代操作系统,它提供了一套先进的跨应用数据共享机制,允许应用之间安全、高效地共享数据。在HarmonyOS开发中,根据HarmonyOS的数据共享特有优势,让HarmonyOS应用开发体验到新技术的使用快感。那么本文就来详细分享一下HarmonyOS中跨应用之间的数据共享等使用方法,以及示例案例分享,希望通过本文能够帮助更多开发者。
跨应用数据共享的重要性
先来了解一下关于跨应用数据共享,其实跨应用数据共享在实际应用中非常重要,个人觉得以下方面对于跨应用数据共享至关重要,具体如下所示:
- 用户体验:它提供无缝衔接的体验,比如在不同应用间共享图片或文档,这都是非常实用的方面;
- 功能互补:允许应用利用其他应用的功能或数据,实现更丰富的服务,应用之间的数据互通也很重要;
- 效率提升:减少数据的重复输入和处理,提高操作效率,尤其是现在处于大数据时代,至关重要。
HarmonyOS的数据共享能力
根据鸿蒙官方的介绍,HarmonyOS通过以下机制支持跨应用数据共享:
- 分布式软总线:提供设备间通信的能力,实现数据的无缝流转,它允许设备之间建立快速、稳定的连接。
- Ability Slice:允许应用以卡片形式被其他应用调用和共享,允许应用将其部分功能或数据以卡片形式分享给其他应用;
- 公共数据目录:在文件系统中定义公共数据存储区域,供多个应用访问,这些数据可以被具有相应权限的其他应用访问。
再来分享一下HarmonyOS的跨应用数据共享,跨应用数据共享提供了向其他应用共享以及管理其数据的方法,支持不同应用之间的数据协同。在许多应用场景中都需要用到数据共享,比如将电话簿、短信、媒体库中的数据共享给其他应用等,但不是所有的数据都允许其他应用访问,比如账号、密码等;另外,有些数据也只允许其他应用查询而不允许其删改,比如短信等。所以针对不同数据共享场景以及数据隐私保护,设计一个安全、便捷的跨应用数据共享机制是十分必要的。
相关的基本概念
在进行跨应用数据共享开发前,先来了解以下相关概念,具体如下所示:
- 数据提供方:提供数据及实现相关业务的应用程序,也称为生产者或服务端;
- 数据访问方:访问数据提供方所提供的数据或业务的应用程序,也称为消费者或客户端;
- 数据集:用户要插入的数据集合,可以是一条或多条数据。数据集以键值对的形式存在,键为字符串类型,值支持数字、字符串、布尔值、无符号整型数组等多种数据类型;
- 结果集:用户查询之后的结果集合,其提供了灵活的数据访问方式,以便用户获取各项数据;
- 谓词:用户访问数据库中的数据所使用的筛选条件,经常被应用在更新数据、删除数据和查询数据等场景。
跨应用数据共享的数据管理
目前来看,基于跨应用数据共享中涉及的数据提供方应用个数的不同情况,数据管理提供支持一对多跨应用数据共享和多对多跨应用数据共享的能力。
1、一对多跨应用数据共享
跨应用一对多数据共享的场景,目前仅对系统应用开放,暂不具体展开提供相关内容和指导。
2、多对多跨应用数据共享
区别于一对多数据共享只有一个数据提供方,当多个应用之间需要相互进行数据共享时,即多对多的跨应用数据共享场景下,对于数据的定义、流通和权限管理等是十分必要的。统一数据管理框架(UDMF)即提供一种新的数据共享与交互方式,可以实现多对多跨应用数据共享。
具体实现跨应用数据共享
其实应用可以根据UDMF标准化数据通路提供的数据接入与读取接口,将符合标准化数据定义的数据写入UDMF不同的数据共享通路,并提供多应用进行读取。写入UDMF中的数据依据应用定义的权限、数据通路定义的权限以及整个UDMF框架定义的权限管理逻辑进行管理,写入通路中的数据的生命周期的管理也遵循上述逻辑。这样离散在各个应用的碎片化数据可以在UDMF的不同通路中形成聚合效应,提升开发者跨应用数据协同的效率,同时会极大提升用户的数据体验。
1、场景介绍
在HarmonyOS中可以通过标准化数据通路实现数据共享,这里做一个场景介绍,比如在多对多跨应用数据共享的场景下,需要提供一条数据通路能够接入多个不同应用的数据并共享给其他应用进行读取,UDMF针对多对多跨应用数据共享的不同业务场景提供了标准化的数据通路,提供了标准化的数据接入与读取接口。
2、标准化数据通路的定义和实现
先来了解一下标准化数据通路,标准化数据通路是为各种业务场景提供的跨应用的数据接入与读取通路,它可以暂存应用需要共享的符合标准化数据定义的统一数据对象,并提供给其他应用进行访问,同时按照一定的策略对暂存数据的访问权限和生命周期进行管理。标准化数据通路通过UDMF提供的系统服务实现,应用(数据提供方)需要共享公共数据时可以通过UDMF提供的插入接口将数据写入到UDMF的数据通路中,并且可以通过UDMF提供的更新和删除接口对已经存入UDMF数据通路的数据进行更新和删除操作,而且在完成必要的权限校验后,目标应用(数据访问方)可以通过UDMF提供的读取接口进行数据的访问,数据被读取后,UDMF会统一对数据的生命周期进行管理。
其实,统一数据对象UnifiedData在UDMF数据通路中具有全局唯一URI标识,其定义为udmf://intention/bundleName/groupId,其中各组成部分的含义分别为:
- udmf: 协议名,表示使用UDMF提供的数据通路。
- intention: UDMF已经支持的数据通路类型枚举值,对应不同的业务场景。
- bundleName: 数据来源应用的包名称。
- groupId:分组名称,支持批量数据分组管理。
当前UDMF中的跨应用数据共享通路有:公共数据通路。
3、公共数据通路
关于公共数据通路,其实就是应用共享的公用数据共享通路,所有应用均可向通路中写入数据,写入方可以根据写入数据时生成的数据唯一标识符进行数据的更新、删除、指定数据标识符进行查询、全量查询,而数据读取方只能读取当前数据通路中的全量数据,通路对应的Intention枚举类型为DATA_HUB。
4、标准化数据通路的相关接口
根据鸿蒙官方介绍,关于UDMF标准化数据通路的相关接口,均为异步接口,异步接口均有callback和Promise两种返回形式,下图均以callback形式为例,具体如下所示:
接口名称 | 描述 |
insertData(options: Options, data: UnifiedData, callback: AsyncCallback): void | 将数据写入UDMF的公共数据通路中,并生成数据的唯一标识符,使用callback异步回调。 |
updateData(options: Options, data: UnifiedData, callback: AsyncCallback): void | 更新已写入UDMF的公共数据通路的数据,使用callback异步回调。 |
queryData(options: Options, callback: AsyncCallback>): void | 查询UDMF公共数据通路的数据,使用callback异步回调。 |
deleteData(options: Options, callback: AsyncCallback>): void | 删除UDMF公共数据通路的数据,返回删除的数据集,使用callback异步回调。 |
5、开发步骤
由于篇幅有限,这里以一次多对多数据共享的过程为例说明开发步骤,数据提供方可以通过UMDF提供的insertData接口将数据写入公共数据通路,获取到的返回值(生成的数据的唯一标识符),可用于对其插入的数据进行更新和删除操作。数据访问方则可以通过UDMF提供的查询接口获取当前公共数据通路的全量数据。
6、数据提供方
(1)导入unifiedDataChannel和uniformTypeDescriptor模块
import { unifiedDataChannel, uniformTypeDescriptor } from '@kit.ArkData';
(2)创建一个统一数据对象并插入到UDMF的公共数据通路中
import { BusinessError } from '@kit.BasicServicesKit';
let plainText = new unifiedDataChannel.PlainText();
plainText.textContent = 'hello sanzhanggui';
let unifiedData = new unifiedDataChannel.UnifiedData(plainText);
// 要插入数据的数据通路枚举类型
let options: unifiedDataChannel.Options = {
intention: unifiedDataChannel.Intention.DATA_HUB
}
try {
unifiedDataChannel.insertData(options, unifiedData, (err, key) => {
if (err === undefined) {
console.info(Succeeded in inserting data. key = ${key});
} else {
console.error(Failed to insert data. code is ${err.code},message is ${err.message} );
}
});
} catch (e) {
let error: BusinessError = e as BusinessError;
console.error(Insert data throws an exception. code is ${error.code},message is ${error.message} );
}
(3)更新上一步,插入统一数据对象
let plainText = new unifiedDataChannel.PlainText();
plainText.textContent = 'Hi, sanzhanggui';
let unifiedData = new unifiedDataChannel.UnifiedData(plainText);
// 指定要更新的统一数据对象的URI
let options: unifiedDataChannel.Options = {
// 这里的key值要与insertData接口回调函数中key保持一致
key: 'udmf://DataHub/com.ohos.t/334'
};
try {
unifiedDataChannel.updateData(options, unifiedData, (err) => {
if (err === undefined) {
console.info('Succeeded');
} else {
console.error(Failed to update data. code is ${err.code},message is ${err.message} );
}
});
} catch (e) {
let error: BusinessError = e as BusinessError;
console.error(Update data throws an exception. code is ${error.code},message is ${error.message} );
}
(4)删除存储在UDMF公共数据通路中的统一数据对象
// 删除数据的数据通路枚举类型
let options: unifiedDataChannel.Options = {
intention: unifiedDataChannel.Intention.DATA_HUB
};
try {
unifiedDataChannel.deleteData(options, (err, data) => {
if (err === undefined) {
console.info(Succeeded = ${data.length});
for (let i = 0; i < data.length; i++) {
let records = data[i].getRecords();
for (let j = 0; j < records.length; j++) {
if (records[j].getType() === uniformTypeDescriptor.UniformDataType.PLAIN_TEXT) {
let text = records[j] as unifiedDataChannel.PlainText;
console.info(${i + 1}.${text.textContent});
}
}
}
} else {
console.error(Failed ${err.code},message is ${err.message} );
}
});
} catch (e) {
let error: BusinessError = e as BusinessError;
console.error(Delete ${error.code},message is ${error.message} );
}
7、数据访问方
(1)导入unifiedDataChannel和uniformTypeDescriptor模块
import { unifiedDataChannel, uniformTypeDescriptor } from '@kit.ArkData';
(2)查询存储在UDMF公共数据通路中的全量统一数据对象
import { BusinessError } from '@kit.BasicServicesKit';
// 查询数据的数据通路枚举类型
let options: unifiedDataChannel.Options = {
intention: unifiedDataChannel.Intention.DATA_HUB
};
try {
unifiedDataChannel.queryData(options, (err, data) => {
if (err === undefined) {
console.info(Succeeded = ${data.length});
for (let i = 0; i < data.length; i++) {
let records = data[i].getRecords();
for (let j = 0; j < records.length; j++) {
if (records[j].getType() === uniformTypeDescriptor.UniformDataType.PLAIN_TEXT) {
let text = records[j] as unifiedDataChannel.PlainText;
}
}
}
} else {
console.error(Failed ${err.code},message is ${err.message} );
}
});
} catch(e) {
let error: BusinessError = e as BusinessError;
console.error(Query ${error.code},message is ${error.message} );
}
上面代码示例,详细演示了一次多对多数据共享的过程以及开发步骤,数据提供方可以通过UMDF提供的insertData接口将数据写入公共数据通路,获取到的返回值,可用于对其插入的数据进行更新和删除操作;数据访问方则可以通过UDMF提供的查询接口获取当前公共数据通路的全量数据。
延伸:数据共享的安全和隐私
虽然数据共享带来开发和使用的极大便利,但是随着现在数据安全的严峻形势,数据隐私越来越成为大家关注的重点,那么在实现跨应用数据共享时,也必须考虑数据安全和用户隐私,这里简单分享一下关于数据共享的安全预防:
- 权限管理:确保只有具有适当权限的应用才能访问共享数据,切忌没有设置权限。
- 数据加密:对共享的数据进行加密,确保数据传输的安全性,对敏感数据进行加密处理。
- 用户授权:在需要时请求用户的明确授权,尊重用户的选择,根据实际需要来选择授权,切忌一键授权所有权限。
结束语
经过本文的详细介绍,大家想必对跨应用数据共享有了更加深入的了解和掌握,我们也可以看到跨应用数据共享是HarmonyOS提升用户体验和促进应用间协作的重要特性。通过HarmonyOS中跨应用数据共享的具体使用示例,可以很好的进行使用掌握。但是,我们在实现数据共享时,也要重视数据安全和用户隐私,确保数据共享的合理性和安全性,这样我们的应用才能既好用又安全!随着HarmonyOS生态的不断发展,跨应用数据共享肯定会变得更加智能、高效和安全!