继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

HarmonyOS NEXT 获取AAID并保存到Asset中,避免卸载重装后改变

水滴石轩
关注TA
已关注
手记 17
粉丝 0
获赞 3

在鸿蒙原生开发中,需要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 ---------------

后面会继续补充不足之处。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP