写点什么

ArkUI-X 平台差异化

作者:龙儿筝
  • 2025-06-10
    湖北
  • 本文字数:1316 字

    阅读完需:约 4 分钟

跨平台使用场景是一套 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 ErrorERROR: 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(() => {
}) }}
复制代码


发布于: 刚刚阅读数: 5
用户头像

龙儿筝

关注

还未添加个人签名 2024-10-27 加入

还未添加个人简介

评论

发布
暂无评论
ArkUI-X平台差异化_龙儿筝_InfoQ写作社区