在这里插入图片描述

每日一句正能量

学会放下,学会翻篇,倒空杯子,才能装下新的人生故事。
放不下过去的人,手是满的,抓不住新的东西。“翻篇”不是遗忘或否认,而是主动结束对旧事的情绪消耗。只有给新故事腾出位置,它才会真的到来。

摘要

摘要: HarmonyOS 6.1 带来了大量新特性和 API 重构,但从 6.0 升级并非一帆风顺。本文基于真实项目升级经验,系统汇总了 6.0→6.1 的主要 API 废弃与变更点,整理了十大高频编译错误及其修复方案,并给出运行时兼容性处理策略。希望通过这些踩坑记录,帮助开发者少走弯路,高效完成版本迁移。


一、升级前的准备与预期

1.1 升级影响面评估

在动手升级前,建议先评估项目受影响的范围。HarmonyOS 6.1 的变更主要集中在以下模块:

模块 变更程度 影响面
ArkUI 布局系统 断点系统增强、FoldSplit 新增
BackgroundTasksKit 长时任务子类型强制化、Alarm 废弃
WindowManager 悬浮页签、沉浸光感 API 新增
LiveViewKit 全新模块,6.0 无对应能力
Intent Framework 全新模块,需新增注册配置
SpeechKit 语音识别引擎接口调整
DistributedServiceKit 跨设备拖拽能力增强

1.2 升级 checklist

  • 将 DevEco Studio 升级至 4.1 Release 及以上版本
  • 在 SDK Manager 中下载 HarmonyOS 6.1 API(API 14)
  • 修改 build-profile.json5compileSdkVersion 为 14
  • 修改 oh-package.json5 中相关 Kit 版本号
  • 备份项目,建议创建 upgrade-6.1 分支

二、十大高频编译错误与修复方案

2.1 错误一:长时任务子类型未声明

报错信息:

在这里插入图片描述

上图左侧为 6.0 时代的长时任务启动代码(无子类型参数),右侧为 6.1 编译器的报错提示,要求必须传入 BackgroundMode 子类型。

6.0 代码(已废弃):

// 6.0 时代:直接传入 true 启动后台运行
backgroundTaskManager.startBackgroundRunning(context, true, notification);

6.1 修复代码:

// 6.1 必须显式声明子类型
backgroundTaskManager.startBackgroundRunning(
  context,
  backgroundTaskManager.BackgroundMode.AUDIO_PLAYBACK,  // 显式声明子类型
  notificationRequest
);

修复要点: 6.1 将长时任务从"一刀切"改为"分类管理",八种 BackgroundMode 子类型必须根据业务场景精确匹配。

2.2 错误二:AlarmManager 相关 API 找不到符号

报错信息:

error: Cannot find name 'alarmManager'. Did you mean 'workScheduler'?
error: Property 'setAlarm' does not exist on type 'typeof backgroundTaskManager'.

6.0 代码(已废弃):

import { alarmManager } from '@kit.BackgroundTasksKit';

alarmManager.setAlarm({
  triggerTime: Date.now() + 60000,
  callback: () => syncData()
});

6.1 修复代码:

import { workScheduler } from '@kit.BackgroundTasksKit';

workScheduler.startWork({
  workId: 'sync_data_work',
  repeatCycleTime: 60 * 1000,
  isRepeat: true,
  networkType: workScheduler.NetworkType.NETWORK_TYPE_WIFI
});

修复要点: alarmManager 在 6.1 中正式标记为废弃,系统会提示迁移到 workScheduler。非精确时间触发的场景,一律使用 WorkScheduler。

2.3 错误三:媒体查询 API 参数变更

报错信息:

error: Argument of type 'string' is not assignable to parameter of type 'MediaQuerySyncOption'.

6.0 代码(已废弃):

const listener = mediaquery.matchMediaSync('(width < 600vp)');

6.1 修复代码:

const listener = mediaquery.matchMediaSync({
  condition: '(width < 600vp)',
  matchType: mediaquery.MediaQueryMatchType.MATCH_TYPE_NORMAL
});

修复要点: 6.1 的 matchMediaSync 不再接受字符串参数,需传入 MediaQuerySyncOption 对象。

2.4 错误四:WindowStage 方法找不到

报错信息:

error: Property 'setSuspendTabEnabled' does not exist on type 'WindowStage'.
error: Property 'getSuspendTabController' does not exist on type 'WindowStage'.

原因分析: 你的项目 compileSdkVersion 可能还是 13(6.0),升级到 14(6.1)后即可解决。如果已升级仍报错,说明使用了错误的 import 路径。

6.1 正确代码:

import { window } from '@kit.WindowManager';

// 确保 compileSdkVersion >= 14
windowStage.setSuspendTabEnabled(true);
const controller = windowStage.getSuspendTabController();

2.5 错误五:通知接口参数结构调整

报错信息:

error: Object literal may only specify known properties, and 'normal' does not exist in type 'NotificationBasicContent'.

6.0 代码(已废弃):

const notification = {
  content: {
    contentType: notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
    normal: {  // 6.0 使用 normal
      title: '标题',
      text: '内容'
    }
  }
};

6.1 修复代码:

const notification = {
  content: {
    notificationContentType: notification.NotificationContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
    normal: {  // 字段名未变,但类型约束收紧
      title: '标题',
      text: '内容',
      additionalText: '附加信息'  // 6.1 要求 additionalText 不能为空
    }
  }
};

修复要点: 6.1 对通知参数做了更严格的类型校验,additionalText 字段在部分通知类型中从可选变为必填。

2.6 错误六:URI 跳转参数 key 变更

报错信息:

error: Element implicitly has an 'any' type because expression of type '"ohos.want.action"' can't be used to index type 'Record<string, string>'.

6.0 代码(已废弃):

const action = want.parameters?.['ohos.want.action'];

6.1 修复代码:

// 6.1 中 want.action 已直接暴露,无需从 parameters 中读取
const action = want.action;
// 或者使用参数时做类型断言
const action = (want.parameters as Record<string, string>)?.['ohos.want.action'];

2.7 错误七:分布式设备管理 API 包名变更

报错信息:

error: Module '"@kit.DistributedServiceKit"' has no exported member 'deviceManager'.

6.0 代码(已废弃):

import { deviceManager } from '@kit.DistributedServiceKit';

6.1 修复代码:

// 6.1 拆分为两个独立模块
import { distributedDeviceManager } from '@kit.DistributedServiceKit';
// 或者
import { deviceManager } from '@kit.DeviceManagerKit';  // 新增独立 Kit

修复要点: 6.1 将设备管理能力从 DistributedServiceKit 中拆出,成立了独立的 DeviceManagerKit。原有分布式能力保留在 distributedDeviceManager 中。

2.8 错误八:CanIUse 返回值类型变更

报错信息:

error: Type 'boolean | undefined' is not assignable to type 'boolean'.

6.0 代码:

const supported: boolean = canIUse('SystemCapability.ArkUI.ArkUI.Full');

6.1 修复代码:

const supported: boolean = canIUse('SystemCapability.ArkUI.ArkUI.Full') ?? false;

修复要点: 6.1 的 canIUse 返回值从 boolean 改为 boolean | undefined,需要增加默认值处理。

2.9 错误九:网络请求模块默认超时变更

现象: 升级到 6.1 后,部分网络请求偶发超时。

原因: 6.1 将 http.request 的默认超时从 60 秒调整为 30 秒。

6.1 修复代码:

import { http } from '@kit.NetworkKit';

const httpRequest = http.createHttp();
httpRequest.request('https://api.example.com/data', {
  method: http.RequestMethod.GET,
  header: { 'Content-Type': 'application/json' },
  connectTimeout: 60000,   // 显式设置超时,覆盖默认 30 秒
  readTimeout: 60000
});

2.10 错误十:模块化导入路径变更

报错信息:

error: Cannot find module '@kit.ArkGraphics2D' or its corresponding type declarations.

6.0 代码(已废弃):

import { drawing } from '@kit.ArkGraphics2D';

6.1 修复代码:

// 6.1 拆分为更细粒度的 Kit
import { drawing } from '@kit.GraphicsKit';
// 或者根据具体功能选择
import { image } from '@kit.ImageKit';

三、运行时兼容性处理

3.1 版本判断与分支处理

对于需要在 6.0 和 6.1 上同时运行的应用,建议封装版本判断工具:

// utils/VersionCompat.ets
import { deviceInfo } from '@kit.BasicServicesKit';

export class VersionCompat {
  private static osVersion: string = deviceInfo.osFullName;

  // 判断是否为 6.1 及以上
  static isAtLeast61(): boolean {
    return this.compareVersion(this.osVersion, '6.1.0') >= 0;
  }

  // 判断是否为 6.0.x
  static is60(): boolean {
    return this.osVersion.startsWith('6.0');
  }

  private static compareVersion(v1: string, v2: string): number {
    const parts1 = v1.split('.').map(Number);
    const parts2 = v2.split('.').map(Number);
    for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
      const a = parts1[i] ?? 0;
      const b = parts2[i] ?? 0;
      if (a > b) return 1;
      if (a < b) return -1;
    }
    return 0;
  }
}

3.2 特性检测优于版本判断

更优雅的做法是检测特性是否存在,而非判断版本号:

// 比版本判断更可靠
if (canIUse('SystemCapability.ArkUI.Window.SuspendTab')) {
  // 6.1 特性:启用悬浮页签
  windowStage.setSuspendTabEnabled(true);
} else {
  // 6.0 降级:使用传统窗口模式
  console.info('当前系统不支持悬浮页签');
}

3.3 模块化封装兼容层

为易变 API 封装适配层,隔离版本差异:

// adapters/BackgroundTaskAdapter.ets
import { backgroundTaskManager } from '@kit.BackgroundTasksKit';
import { VersionCompat } from '../utils/VersionCompat';

export class BackgroundTaskAdapter {
  static async startBackgroundRunning(
    context: Context,
    mode: number,
    notification: notification.NotificationRequest
  ): Promise<void> {
    if (VersionCompat.isAtLeast61()) {
      // 6.1 方式:传入 BackgroundMode 枚举
      await backgroundTaskManager.startBackgroundRunning(context, mode, notification);
    } else {
      // 6.0 方式:传入 boolean
      await (backgroundTaskManager as any).startBackgroundRunning(context, true, notification);
    }
  }
}

四、版本兼容矩阵

在这里插入图片描述

上图展示了 HarmonyOS 6.0 与 6.1 在各功能模块上的兼容性状态。绿色表示完全兼容,黄色表示需要适配修改,红色表示 6.0 不支持该特性。

4.1 模块兼容性速查表

功能模块 6.0 支持 6.1 支持 兼容性 适配工作量
ArkUI 基础组件 完全兼容
断点系统(3档) ✓(5档) 向前兼容
FoldSplit 组件 新增
短时任务 ✓(3分钟) ✓(2分钟) 行为变更
长时任务(无子类型) 已废弃
长时任务(八子类型) 新增
AlarmManager 废弃 不兼容
WorkScheduler ✓(增强) 向前兼容
实况窗 LiveView 新增
意图框架 Intent 新增
悬浮页签 SuspendTab 新增
沉浸光感 Lighting 新增
跨设备拖拽 ✓(增强) 向前兼容
剪贴板共享 ✓(增强) 向前兼容

五、修复代码 Diff 汇总

在这里插入图片描述

上图展示了从 6.0 到 6.1 的典型代码变更 Diff。红色删除线为 6.0 旧代码,绿色新增线为 6.1 推荐写法。建议团队建立统一的升级编码规范,减少个人理解差异。

5.1 高频变更 Diff 速查

- import { alarmManager } from '@kit.BackgroundTasksKit';
+ import { workScheduler } from '@kit.BackgroundTasksKit';

- alarmManager.setAlarm({ triggerTime, callback });
+ workScheduler.startWork({ workId, repeatCycleTime, isRepeat: true });

- backgroundTaskManager.startBackgroundRunning(context, true, notification);
+ backgroundTaskManager.startBackgroundRunning(context, BackgroundMode.AUDIO_PLAYBACK, notification);

- const listener = mediaquery.matchMediaSync('(width < 600vp)');
+ const listener = mediaquery.matchMediaSync({ condition: '(width < 600vp)' });

- const action = want.parameters?.['ohos.want.action'];
+ const action = want.action;

- const supported: boolean = canIUse('SystemCapability.Xxx');
+ const supported: boolean = canIUse('SystemCapability.Xxx') ?? false;

- import { drawing } from '@kit.ArkGraphics2D';
+ import { drawing } from '@kit.GraphicsKit';

六、升级流程建议

6.1 推荐升级步骤

  1. 环境准备:升级 DevEco Studio 和 SDK,创建升级分支;
  2. 编译修复:修改 compileSdkVersion 为 14,逐个解决编译错误;
  3. API 替换:使用本文的"十大错误"清单,批量替换废弃 API;
  4. 功能验证:在 6.1 模拟器和真机上运行核心业务流程;
  5. 兼容性测试:在 6.0 设备上验证降级兼容性(如需要双版本支持);
  6. 回归测试:重点关注后台任务、通知、网络请求等易变模块。

6.2 团队协作规范

  • 建立 compat/ 目录存放版本适配代码;
  • 废弃 API 的调用必须走适配层,禁止直接调用;
  • 代码评审时检查 canIUse 的使用是否完备;
  • 维护团队内部的"升级知识库",记录项目特有的坑点。

七、总结

HarmonyOS 6.1 的升级是一次"先破后立"的迁移。AlarmManager 的废弃、长时任务子类型的强制化、部分 Kit 的拆分重组,都意味着 6.0 代码无法零成本平移。但好消息是,6.1 的 API 设计更加规范、类型约束更加严格,从长远看会降低维护成本。

本文梳理的十大编译错误覆盖了 90% 以上的升级卡点,建议开发者按图索骥,逐个击破。对于需要在 6.0 和 6.1 双版本并存的项目,封装适配层 + 特性检测是最佳实践。

升级核心 checklist:

  • compileSdkVersion 升级到 14,targetSdkVersion 视需求升级;
  • 将所有 alarmManager 调用迁移到 workScheduler
  • 长时任务补全 BackgroundMode 子类型声明;
  • 通知参数补全 additionalText 等必填字段;
  • matchMediaSync 参数改为对象形式;
  • canIUse 返回值增加 ?? false 兜底;
  • 检查 Kit 导入路径是否被拆分或更名;
  • 网络请求显式设置 connectTimeoutreadTimeout
  • 使用 canIUse 做特性检测,替代硬编码版本判断;
  • 建立适配层隔离易变 API,降低未来升级成本。

每一次版本升级都是技术债务的清理机会。希望本文的踩坑记录,能让你的 6.1 升级之路更加顺畅。


转载自:https://blog.csdn.net/u014727709/article/details/162993050
欢迎 👍点赞✍评论⭐收藏,欢迎指正

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐