[Harmony]跳转应用商店进行版本更新

必须要用真机来调试,用模拟器的话就会跳转失败。

TypeScript 复制代码
/**
 * 跳转应用商店更新页
 * @param context UIAbility上下文
 * 用真机调试
 * 微信:com.tencent.wechat 高德:com.amap.hmapp 微信在华为市场的官方ID:C100375477
 */
static jumpToAppStore(context: common.UIAbilityContext) {
  let bName = context.applicationInfo.name; // 获取当前包名 context.applicationInfo.name
  const want: Want = {
    abilityName: 'EntryAbility',
    uri: "store://appgallery.huawei.com/app/detail?id=" + bName
  };
  context.startAbility(want).then(()=>{
    console.log("跳转成功!");
  }).catch((err: Error)=>{
    console.log("跳转失败!" + err.message);
  });
}

示意图

自己后端的版本更新接口,用来判断版本号和返回更新内容,以及返回配置信息。

必须要用真机来调试跳转应用市场,用模拟器的话就会跳转失败,不会弹窗下面这个弹窗。

app还没上架时,跳转商店就会展示如下页面,提示"此应用暂不支持在当前设备安装"。

我们可以更换成微信包名"com.tencent.wechat",再次跳转应用商店,就能看见微信的应用详情页面。

完整代码

TypeScript 复制代码
import bundleManager from '@ohos.bundle.bundleManager';
import type { common, Want } from '@kit.AbilityKit';
import { AppUserDataShare } from '../data/MFUserDataShared';
import { httpReq } from '../network/HttpService';
import { plainToClass } from 'class-transformer';
import { MFAppVersionModel } from '../../pages/models/MFAppVersionModel';
import { Toast } from '../custom/Toast';

export class VersionUtil {
  /**
   * 获取当前应用版本信息
   * @returns Promise<string> 格式: 版本名(版本号)
   */
  static async getCurrentVersion(): Promise<string> {
    try {
      const bundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
      return `${bundleInfo.versionName}`; //`${bundleInfo.versionName}(${bundleInfo.versionCode})`;
    } catch (err) {
      //console.error(`[VersionUtil] getCurrentVersion error: ${err.message}`);
      return '';
    }
  }

  /**
   * 异步获取应用自身版本信息
   */
  static async getAppVersionCode(): Promise<number> {
    try {
      const bundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
      return bundleInfo.versionCode;
    } catch (err) {
      //console.error('获取版本信息失败:', err);
      return 1000000;
    }
  }

  /**
   * 获取版本更新信息
   * @param resBLock
   * res  true:成功 false:失败
   */
  static requestAppVersionApi(showToast: boolean, resBlock?: (res: boolean, vModel?: MFAppVersionModel)=>void) {
    if (!AppUserDataShare.isLogin()) { return }
    let par = {
      'platform': 'harmony'
    } as Record<string, number | String>;
    httpReq.get('/Org/SaaSAppVersion', par).then(async resData => {
      if (resData.RetData != undefined) {
        let versionModel = plainToClass(MFAppVersionModel, resData.RetData);
        // let tempEnForce = versionModel?.en_force ?? false
        let reqVersionCode = Number(versionModel.version_code);  // 接口返回Code
        let curVersionCode = await VersionUtil.getAppVersionCode(); // 本地Code
        if (reqVersionCode > curVersionCode) {
          //console.log('检测到新版本');
          let tempShowAlert = versionModel?.show_alert ?? true
          if (tempShowAlert) {
            resBlock?.(true, versionModel)
          } else {
            resBlock?.(false)
          }
        } else {
          if (showToast) {
            Toast.show('当前已是最新版本')
          }
          resBlock?.(false)
        }
      } else {
        resBlock?.(false)
      }
    })
      .catch((error: Error) => {
        resBlock?.(false)
      });
  }

  /**
   * 跳转应用商店更新页
   * @param context UIAbility上下文
   * 用真机调试
   * 微信:com.tencent.wechat 高德:com.amap.hmapp 微信在华为市场的官方ID:C100375477
   */
  static jumpToAppStore(context: common.UIAbilityContext) {
    let bName = context.applicationInfo.name; // 获取当前包名 context.applicationInfo.name
    // todo_zdm //bName = 'com.tencent.wechat'
    const want: Want = {
      abilityName: 'EntryAbility',
      uri: "store://appgallery.huawei.com/app/detail?id=" + bName
    };
    context.startAbility(want).then(()=>{
      // 拉起成功
      console.log("跳转成功!");
    }).catch((err: Error)=>{
      // 拉起失败
      console.log("跳转失败!" + err.message);
      //console.log("跳转失败!" + JSON.stringify(err));
    });
  }
}
TypeScript 复制代码
import { Expose, Transform } from "class-transformer";
import { BaseModel } from "../../support/base/BaseModel";

@Expose()
export class MFAppVersionModel extends BaseModel {

  @Expose()
  @Transform((obj) => obj.value ?? '')
  content: string = '' // 更新内容  
  @Expose()
  @Transform((obj) => obj.value ?? '')
  download_url: string = '' // 下载地址 
  @Expose()
  @Transform((obj) => obj.value ?? false)
  en_force: boolean = false // 是否强制更新 true
  @Expose()
  @Transform((obj) => obj.value ?? '')
  platform: string = '' // 平台 "harmony"
  @Expose()
  @Transform((obj) => obj.value ?? true)
  show_alert: boolean = true // 是否展示弹窗 true
  @Expose()
  @Transform((obj) => obj.value ?? '')
  version_code: string = '' // 版本号  

}
TypeScript 复制代码
{
  "app": {
    "bundleName": "com.mofshar.www",
    "vendor": "mofsaas",
    "versionCode": 1000000, 
    "versionName": "1.0.0",
    "icon": "$media:layered_image",
    "label": "$string:app_name"
  }
}
相关推荐
王码码20353 小时前
Flutter for OpenHarmony 实战之基础组件:第三十一篇 Chip 系列组件 — 灵活的标签化交互
android·flutter·交互·harmonyos
坚果派·白晓明4 小时前
在鸿蒙设备上快速验证由lycium工具快速交叉编译的C/C++三方库
c语言·c++·harmonyos·鸿蒙·编程语言·openharmony·三方库
lbb 小魔仙4 小时前
【HarmonyOS实战】OpenHarmony + RN:自定义 useFormik 表单处理
react native·harmonyos
果粒蹬i4 小时前
【HarmonyOS】DAY7:鸿蒙跨平台 Tab 开发问题与列表操作难点深度复盘
华为·harmonyos
王码码20355 小时前
Flutter for OpenHarmony 实战之基础组件:第二十七篇 BottomSheet — 动态底部弹窗与底部栏菜单
android·flutter·harmonyos
ITUnicorn5 小时前
【HarmonyOS6】ArkTS 自定义组件封装实战:动画水杯组件
华为·harmonyos·arkts·鸿蒙·harmonyos6
全栈探索者6 小时前
@Component + struct = 你的新函数组件——React 开发者的鸿蒙入门指南(第 2 期)
react·harmonyos·arkts·前端开发·deveco studio·鸿蒙next·函数组件
廖松洋(Alina)6 小时前
【收尾以及复盘】flutter开发鸿蒙APP之成就徽章页面
flutter·华为·开源·harmonyos·鸿蒙
廖松洋(Alina)7 小时前
【收尾以及复盘】flutter开发鸿蒙APP之打卡日历页面
flutter·华为·开源·harmonyos·鸿蒙
廖松洋(Alina)7 小时前
【收尾以及复盘】flutter开发鸿蒙APP之本月数据统计页面
flutter·华为·开源·harmonyos·鸿蒙