平臺差異化
簡介
跨平臺使用場景是一套ArkTS代碼運行在多個終端設備上,如Android、iOS、OpenHarmony(含基于OpenHarmony發行的商業版,如HarmonyOS Next)。當不同平臺業務邏輯不同,或使用了不支持跨平臺的API,就需要根據平臺不同進行一定代碼差異化適配。當前僅支持在代碼運行態進行差異化,接下來詳細介紹場景及如何差異化適配。
使用場景及能力
使用場景
平臺差異化適用于以下兩種典型場景:
- 自身業務邏輯不同平臺本來就有差異;
- 在OpenHarmony上調用了不支持跨平臺的API,這就需要在OpenHarmony上仍然調用對應API,其他平臺通過Bridge橋接機制進行差異化處理;
- 開發前請熟悉鴻蒙開發指導文檔:[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]點擊或者復制轉到。
判斷平臺類型
可以通過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橋接機制處理,示例代碼如下:
- 新建一個
WiFiUtil.ts
,并忽略告警:
import wifiManager from '@ohos.wifiManager'
export class WiFiUtil {
static isActive(): boolean {
//@ts-ignore
return wifiManager.isWifiActive();
}
}
`HarmonyOS與OpenHarmony鴻蒙文檔籽料:mau123789是v直接拿`
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(() = > {
})
}
}
-
Android
+關注
關注
12文章
3923瀏覽量
127128 -
HarmonyOS
+關注
關注
79文章
1967瀏覽量
30013 -
OpenHarmony
+關注
關注
25文章
3658瀏覽量
16144 -
鴻蒙OS
+關注
關注
0文章
188瀏覽量
4367
發布評論請先 登錄
相關推薦
評論