ArkUI-X平台差异化

举报
yd_233809488 发表于 2025/06/10 23:11:23 2025/06/10
【摘要】 跨平台使用场景是一套ArkTS代码运行在多个终端设备上,如Android、iOS、OpenHarmony(含基于OpenHarmony发行的商业版,如HarmonyOS Next)。当不同平台业务逻辑不同,或使用了不支持跨平台的API,就需要根据平台不同进行一定代码差异化适配。当前仅支持在代码运行态进行差异化,接下来详细介绍场景及如何差异化适配。 使用场景平台差异化适用于以下两种典型场景:1...

跨平台使用场景是一套ArkTS代码运行在多个终端设备上,如Android、iOS、OpenHarmony(含基于OpenHarmony发行的商业版,如HarmonyOS Next)。当不同平台业务逻辑不同,或使用了不支持跨平台的API,就需要根据平台不同进行一定代码差异化适配。当前仅支持在代码运行态进行差异化,接下来详细介绍场景及如何差异化适配。

使用场景

平台差异化适用于以下两种典型场景:

1.自身业务逻辑不同平台本来就有差异;
2.在OpenHarmony上调用了不支持跨平台的API,这就需要在OpenHarmony上仍然调用对应API,其他平台通过Bridge桥接机制进行差异化处理;

判断平台类型

可以通过let osName: string = deviceInfo.osFullName;获取对应OS名字,该接口已支持跨平台,不同平台上其返回值如下:

OpenHarmony上,osName等于OpenHarmony-XXX
Android上,osName等于Android XXX
iOS上,osName等于iOS XXX

示例如下:

test() {
  let osName: string = deviceInfo.osFullName;
  console.log('osName = ' + osName);
  if (osName.startsWith('OpenHarmony')) {
    // OpenHarmony应用平台上业务逻辑
  } else if (osName.startsWith('Android')) {
    // Android应用平台上业务逻辑
  } else if (osName.startsWith('iOS')) {
    // iOS应用平台上业务逻辑
  }
}

非跨平台API处理

在跨平台工程中如果调用非跨平台API,编译时IDE会触发拦截并报错。接下来以调用wifiManager.isWifiActive()判断WiFi开关是否打开为例,这个API当前是不支持跨平台的。示例代码:

  test2(){
   let isActive = wifiManager.isWifiActive();
  }

IDE报错:

> hvigor ERROR: Failed :feature:default@CompileArkTS... 
> hvigor ERROR: ArkTS Compiler Error
ERROR: ArkTS:ERROR File: D:/work/git/play-arkuix/Test_ACE/feature/src/main/ets/pages/Index.ets:64:31
'isWifiActive' can't support crossplatform application.

COMPILE RESULT:FAIL {ERROR:2}
> hvigor ERROR: BUILD FAILED in 10 s 753 ms 

此时可以将涉及到的API写到一个后缀为**.ts**文件,然后在不支持的API上面增加// @ts-ignore或// @ts-nocheck屏蔽告警,开发者需要保证只在OpenHarmony应用平台上才运行这一段逻辑,Android和iOS应用平台上可以借用Bridge桥接机制处理,示例代码如下:

1.新建一个WiFiUtil.ts,并忽略告警:

import wifiManager from '@ohos.wifiManager'

export class WiFiUtil {
  static isActive(): boolean {
    //@ts-ignore
    return wifiManager.isWifiActive();
  }
}

2.根据不同平台差异化逻辑,Android和iOS应用平台上通过Bridge机制桥接到对应平台的业务逻辑实现上:

checkTestWiFi(): void {
  let osName: string = deviceInfo.osFullName;
  console.log('osName = ' + osName);
  if (osName.startsWith('OpenHarmony')) {
    // OpenHarmony应用平台
    let isActive = WiFiUtil.isActive();
    this.message = isActive ? '已连接' : '未连接';
  } else {
    // Android和iOS应用平台上,中转到原生
    let bridge = Bridge.createBridge('Bridge');
    bridge.callMethod('isWiFiActive').then((res) => {
      // 业务逻辑处理...
    }).catch(() => {

    })
  }
}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。