[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"
  }
}
相关推荐
欧学明1 小时前
希影RS80 Ultra 鸿蒙巨幕 4K投影仪:2㎡阳台的多元光影体验
harmonyos·希影 rs80 ultra
马剑威(威哥爱编程)1 小时前
【鸿蒙开发实战篇】鸿蒙跨设备的碰一碰文件分享
华为·harmonyos
赵财猫._.1 小时前
鸿蒙超级终端体验:无缝流转的底层实现与用户体验优化
wpf·harmonyos·ux
A懿轩A1 小时前
【2025版 OpenHarmony】GitCode 口袋工具 v1.0.3:Flutter + HarmonyOS 深色模式全面启用
flutter·harmonyos·openharmony·gitcode·开源鸿蒙
YJlio1 小时前
[鸿蒙2025领航者闯关] 基于鸿蒙 6 的「隐私感知跨设备办公助手」实战:星盾安全 + AI防窥 + 方舟引擎优化全流程复盘
人工智能·安全·harmonyos
御承扬1 小时前
鸿蒙原生系列之监听布局和送显事件
harmonyos·鸿蒙ndk ui
御承扬1 小时前
鸿蒙原生系列之ArkWeb技能提升——H5调用应用侧API
华为·harmonyos·arkweb·h5调试·h5调用应用方法
食品一少年1 小时前
【Day7-10】开源鸿蒙Flutter 常用组件封装实战(2)
flutter·华为·harmonyos
赵财猫._.8 小时前
鸿蒙分布式安全通信:跨设备身份认证与数据加密传输
分布式·安全·harmonyos