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