在鸿蒙原生开发中,需要import { AAID } from '@kit.PushKit’才能正常使用AAID对应的接口let aaid: string = await AAID.getAAID();获取广告标识aaid,但这里获取到的aaid在下面集中场景下是会改变的
1、 应用卸载重装。
2、应用调用AAID.deleteAAID()接口删除AAID。
3、用户恢复出厂设置。
4、用户清除应用数据。
为了避免以上几种场景导致我们获取的aaid改变,影响业务需求,可以使用Asset对应的功能来持久化保存,这里只介绍asset保存的几种方式,想了解更多可以查看https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V13/js-apis-asset-V13
调用asset相应接口需要先import { asset } from “@kit.AssetStoreKit”,然后将我们需要保存的值放在asset.AssetMap对象中,在调用asset.addSync(attr)进行存储;查询时,需要我们传入保存值时的key,在asset中叫别名alias,然后调用asset.querySync(query);
具体代码示例如下
import { AAID } from '@kit.PushKit';
let aaid = assetQuerySync('gr_harmony_aaid');
if (aaid === undefined || aaid.length === 0) {
aaid = await AAID.getAAID();
assetAddSync('gr_harmony_aaid', aaid);
}
import { asset } from "@kit.AssetStoreKit";
import { BusinessError } from "@kit.BasicServicesKit";
import { util } from "@kit.ArkTS";
const TAG: string = 'DDDataSave';
function stringToArray(str: string): Uint8Array {
let textEncoder = new util.TextEncoder();
return textEncoder.encodeInto(str);
}
function arrayToString(arr: Uint8Array): string {
let textDecoder = util.TextDecoder.create("utf-8", { ignoreBOM: true });
let str = textDecoder.decodeToString(arr, { stream: false });
return str;
}
export function assetQuerySync(alias: string): string | undefined {
let deviceTypeStr: string | undefined = undefined;
let query: asset.AssetMap = new Map();
// 指定了关键资产别名,最多查询到一条满足条件的关键资产
query.set(asset.Tag.ALIAS, stringToArray(alias));
// 返回关键资产属性,不含关键资产明文。
query.set(asset.Tag.RETURN_TYPE, asset.ReturnType.ATTRIBUTES);
try {
let res = asset.querySync(query);
for (let i = 0; i < res.length; i++) { //如果查询的结果与之匹配,说明已经登陆过了
let alias = res[i].get(asset.Tag.ALIAS) as Uint8Array; //查询出存储的别名alias
console.info(TAG, `asset query alias:${arrayToString(alias)}`);
let idStr = res[i].get(asset.Tag.SECRET) as Uint8Array;
console.info(TAG, `asset query alias:${arrayToString(idStr)}`);
let deviceType = res[i].get(asset.Tag.DATA_LABEL_NORMAL_1) as Uint8Array;
deviceTypeStr = arrayToString(deviceType);
console.info(TAG, `asset query alias:${arrayToString(deviceType)}`);
}
} catch (err) {
console.info(TAG, `asset query fail err:${JSON.stringify(err)}`);
}
return deviceTypeStr;
}
export function assetAddSync(alias: string, value: string) {
console.info(TAG, `asset add begin alias:${alias}, value:${value}`);
let attr: asset.AssetMap = new Map();
// SECRET: 关键资产别名,每条关键资产的唯一索引
attr.set(asset.Tag.ALIAS, stringToArray(alias));
attr.set(asset.Tag.SECRET, stringToArray(value));
// DATA_LABEL_NORMAL_1: 关键资产附属信息,内容由业务自定义且无完整性保护。
attr.set(asset.Tag.DATA_LABEL_NORMAL_1, stringToArray(value));
// IS_PERSISTENT: 在应用卸载时是否需要保留关键资产。
attr.set(asset.Tag.IS_PERSISTENT, true);
try {
// 新增一条关键资产
asset.addSync(attr);
console.info(TAG, 'asset add success')
} catch (error) {
let err = error as BusinessError;
console.info(TAG, `try Failed to remove Asset. Code is ${err.code}, message is ${err.message}`);
}
}
----------------- end ---------------
后面会继续补充不足之处。