智能客服
你问我答,随时在线为你解决问题
在安全地理位置场景中,通过创建证明密钥、打开证明会话的方式,对从GPS硬件或网络位置获取到的地理位置信息进行签名,确保地理位置信息的真实性和完整性。
该特性需要设备支持安全地理位置功能。
开发者在调用initializeAttestContext接口成功初始化安全地理位置的证明会话后,通过调用getCurrentSecureLocation接口尝试获取安全地理位置,当接口异常并返回ATTEST_ERROR_LOCATION_SERVICE_UNAVAILABLE时,当前设备不支持安全地理位置。具体判断方法参考如下示例:
- import { trustedAppService } from '@kit.DeviceSecurityKit';
- import { BusinessError } from '@kit.BasicServicesKit';
-
- // 初始化安全地理位置证明会话后,获取安全地理位置信息,以精度优先为例
- const timeout = 5000; // 获取安全地理位置的超时时间,单位为毫秒
- const priority = trustedAppService.LocatingPriority.PRIORITY_ACCURACY; // 采用精度优先策略
- let secureLocation: trustedAppService.SecureLocation;
- // 获取当前安全地理位置信息
- try {
- secureLocation = await trustedAppService.getCurrentSecureLocation(timeout, priority);
- } catch (err) {
- const error = err as BusinessError;
- if (error.code == trustedAppService.AttestExceptionErrCode.ATTEST_ERROR_LOCATION_SERVICE_UNAVAILABLE) {
- console.error(`current device not support secure location`);
- } else {
- console.error(`Failed to get current secure location, message:${error.message}, code:${error.code}`);
- }
- }

应用获取安全地理位置的优先级策略有两种,分别是精度优先和速度优先。如果选择精度优先策略,可信应用服务会优先返回GPS的结果,GPS获取超时后返回网络地理位置;而如果选择速度优先策略,可信应用服务会返回从二者中最先获取到的结果。
接口及使用方法请参见API参考。
| 接口名 | 描述 |
|---|---|
| createAttestKey(options: AttestOptions): Promise<void> | 创建证明密钥。 |
| initializeAttestContext(userData: string, options: AttestOptions): Promise<AttestReturnResult> | 初始化证明会话。 |
| finalizeAttestContext(options: AttestOptions): Promise<void> | 结束证明会话。 |
| destroyAttestKey(): Promise<void> | 销毁证明密钥。 |
| getCurrentSecureLocation(timeout: number, priority: LocatingPriority): Promise<SecureLocation> | 获取安全地理位置信息。 |
申请位置权限,权限名称为“ohos.permission.APPROXIMATELY_LOCATION”和“ohos.permission.LOCATION”,具体请参考向用户申请授权。
导入可信应用服务模块。
- import { trustedAppService } from '@kit.DeviceSecurityKit';
- import { BusinessError } from '@kit.BasicServicesKit';
创建证明密钥并初始化证明会话。
- // 创建证明密钥的参数
- const createProperties: Array<trustedAppService.AttestParam> = [
- {
- tag: trustedAppService.AttestTag.ATTEST_TAG_ALGORITHM,
- value: trustedAppService.AttestKeyAlg.ATTEST_ALG_ECC
- },
- {
- tag: trustedAppService.AttestTag.ATTEST_TAG_KEY_SIZE,
- value: trustedAppService.AttestKeySize.ATTEST_ECC_KEY_SIZE_256
- }
- ];
- const createOptions: trustedAppService.AttestOptions = {
- properties: createProperties
- };
- // 初始化证明会话的参数
- const userData = "trusted_app_service_demo" // 示例值,实际值请自行生成,长度在16到127 Bytes之间
- const initProperties: Array<trustedAppService.AttestParam> = [
- {
- tag: trustedAppService.AttestTag.ATTEST_TAG_DEVICE_TYPE,
- value: trustedAppService.AttestType.ATTEST_TYPE_LOCATION
- },
- {
- tag: trustedAppService.AttestTag.ATTEST_TAG_DEVICE_ID,
- value: BigInt(0) // 此参数在安全地理位置场景下不生效
- }
- ];
- const initOptions: trustedAppService.AttestOptions = {
- properties: initProperties
- };
- // 创建证明密钥并打开证明会话
- let certChainList: Array<string>;
- try {
- await trustedAppService.createAttestKey(createOptions);
- const result = await trustedAppService.initializeAttestContext(userData, initOptions);
- certChainList = result.certChains;
- } catch (err) {
- const error = err as BusinessError;
- console.error(`Failed to initialize attest context, message:${error.message}, code:${error.code}`);
- }
获取安全地理位置信息,以精度优先为例。
- const timeout = 5000; // 获取安全地理位置的超时时间,单位为毫秒
- const priority = trustedAppService.LocatingPriority.PRIORITY_ACCURACY; // 采用精度优先策略
- let secureLocation: trustedAppService.SecureLocation;
- // 获取当前安全地理位置信息
- try {
- secureLocation = await trustedAppService.getCurrentSecureLocation(timeout, priority);
- } catch (err) {
- const error = err as BusinessError;
- console.error(`Failed to get current secure location, message:${error.message}, code:${error.code}`);
- }
结束证明会话。
- // 结束证明会话的参数
- const finalProperties: Array<trustedAppService.AttestParam> = [
- {
- tag: trustedAppService.AttestTag.ATTEST_TAG_DEVICE_TYPE,
- value: trustedAppService.AttestType.ATTEST_TYPE_LOCATION
- }
- ];
- const finalOptions: trustedAppService.AttestOptions = {
- properties: finalProperties,
- };
- // 结束证明会话
- try {
- await trustedAppService.finalizeAttestContext(finalOptions);
- } catch (err) {
- const error = err as BusinessError;
- console.error(`Failed to finalize attest context, message:${error.message}, code:${error.code}`);
- }
如果需要销毁证明密钥,请在结束证明会话后,调用destroyAttestKey接口。