cj-tauri 1.1.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -18
- package/cjpm.toml +52 -52
- package/cli/cjpm.toml +10 -1
- package/cli/src/doctor.cj +4 -2
- package/cli/src/main.cj +11 -3
- package/cli/src/manifest.cj +558 -0
- package/cli/src/project.cj +38 -22
- package/cli/src/scaffold.cj +369 -361
- package/cli/src/sync.cj +526 -0
- package/cli/src/util.cj +168 -159
- package/cli/templates/app/README.md +48 -80
- package/cli/templates/app/{capabilities → assets/capabilities}/default.json +7 -7
- package/cli/templates/app/{ui → assets/ui}/index.html +118 -118
- package/cli/templates/app/cj-tauri.toml +22 -0
- package/cli/templates/app/cjpm.toml +34 -17
- package/cli/templates/app/src/main.cj +90 -88
- package/cli/templates/app-react/README.md +56 -67
- package/cli/templates/app-react/{capabilities → assets/capabilities}/default.json +7 -7
- package/cli/templates/app-react/{ui → assets/ui}/package.json +19 -19
- package/cli/templates/app-react/{ui → assets/ui}/src/main.jsx +6 -6
- package/cli/templates/app-react/{ui → assets/ui}/vite.config.js +24 -24
- package/cli/templates/app-react/cj-tauri.toml +23 -0
- package/cli/templates/app-react/cjpm.toml +34 -17
- package/cli/templates/app-react/src/main.cj +91 -102
- package/cli/templates/app-vue/README.md +56 -60
- package/cli/templates/app-vue/{capabilities → assets/capabilities}/default.json +7 -7
- package/cli/templates/app-vue/{ui → assets/ui}/package.json +18 -18
- package/cli/templates/app-vue/{ui → assets/ui}/src/main.js +4 -4
- package/cli/templates/app-vue/{ui → assets/ui}/vite.config.js +24 -24
- package/cli/templates/app-vue/cj-tauri.toml +23 -0
- package/cli/templates/app-vue/cjpm.toml +34 -17
- package/cli/templates/app-vue/src/main.cj +91 -102
- package/cli/templates/{ohos-pc → ohos-skeleton}/AppScope/app.json5 +13 -13
- package/cli/templates/{ohos-pc → ohos-skeleton}/AppScope/resources/base/element/string.json +8 -8
- package/cli/templates/{ohos-pc → ohos-skeleton}/AppScope/resources/base/media/layered_image.json +6 -6
- package/cli/templates/{ohos-pc → ohos-skeleton}/README.md +79 -79
- package/cli/templates/{ohos-pc → ohos-skeleton}/build-profile.json5 +46 -46
- package/cli/templates/{ohos-pc → ohos-skeleton}/entry/build-profile.json5 +26 -26
- package/cli/templates/{ohos-pc → ohos-skeleton}/entry/cjpm.toml +43 -43
- package/cli/templates/{ohos-pc → ohos-skeleton}/entry/hvigorfile.ts +6 -6
- package/cli/templates/{ohos-pc → ohos-skeleton}/entry/oh-package.json5 +9 -9
- package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/cangjie/ability_stage.cj +17 -17
- package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/cangjie/app_host.cj +94 -94
- package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/cangjie/index.cj +167 -167
- package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/cangjie/main_ability.cj +139 -139
- package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/module.json5 +49 -49
- package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/base/element/color.json +8 -8
- package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/base/element/string.json +16 -16
- package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/base/media/layered_image.json +6 -6
- package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/base/profile/main_pages.json +2 -2
- package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/rawfile/capabilities.json +6 -6
- package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/rawfile/index.html +92 -92
- package/cli/templates/{ohos-pc → ohos-skeleton}/hvigor/hvigor-config.json5 +5 -5
- package/cli/templates/{ohos-pc → ohos-skeleton}/hvigorfile.ts +6 -6
- package/cli/templates/{ohos-pc → ohos-skeleton}/oh-package.json5 +10 -10
- package/package.json +4 -2
- package/prebuilt/win32-x64/cj-tauri.exe +0 -0
- package/src/app.cj +49 -20
- package/src/app_spec.cj +76 -0
- package/src/arkweb_script.cj +142 -154
- package/src/host.cj +20 -17
- package/src/host_arkweb.cj +778 -740
- package/src/host_webkit.cj +22 -0
- package/src/host_webview2.cj +22 -0
- package/src/launch.cj +62 -0
- package/src/platform/platform_app_context.cj +77 -0
- package/src/platform/platform_assets.cj +33 -0
- package/src/platform/platform_discover.cj +176 -0
- package/src/platform/platform_env.cj +29 -0
- package/src/platform/platform_feature.cj +31 -0
- package/src/platform/platform_page_source.cj +87 -0
- package/src/platform/platform_target_info.cj +32 -0
- package/src/platform_host_provider.cj +87 -0
- package/src/plugin.cj +36 -2
- package/src/plugins/clipboard/plugin_clipboard.cj +8 -0
- package/src/plugins/menu/plugin_menu.cj +158 -150
- package/src/plugins/notification/plugin_notification.cj +8 -0
- package/src/plugins/serial/plugin_serial.cj +454 -442
- package/src/plugins/serial/serial_bridge.cj +194 -186
- package/src/plugins/serial/serial_ohos_stub.cj +61 -0
- package/src/plugins/shell/plugin_shell.cj +258 -230
- package/src/plugins/sqlite/plugin_sqlite.cj +710 -697
- package/src/plugins/sqlite/sqlite_ffi.cj +211 -206
- package/src/plugins/sqlite/sqlite_ohos_stub.cj +91 -0
- package/src/tests/app_spec_test.cj +127 -0
- package/src/tests/fake_host.cj +23 -8
- package/src/tests/platform_contract_test.cj +251 -0
- package/src/tests/plugin_test.cj +585 -542
- package/src/version.cj +1 -1
- package/src/host_factory.cj +0 -48
- /package/cli/templates/app-react/{ui → assets/ui}/index.html +0 -0
- /package/cli/templates/app-react/{ui → assets/ui}/src/App.css +0 -0
- /package/cli/templates/app-react/{ui → assets/ui}/src/App.jsx +0 -0
- /package/cli/templates/app-vue/{ui → assets/ui}/index.html +0 -0
- /package/cli/templates/app-vue/{ui → assets/ui}/src/App.vue +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/AppScope/resources/base/media/background.png +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/AppScope/resources/base/media/foreground.png +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/build-hap.sh +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/base/media/background.png +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/base/media/foreground.png +0 -0
- /package/cli/templates/{ohos-pc → ohos-skeleton}/entry/src/main/resources/base/media/startIcon.png +0 -0
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
[package]
|
|
2
|
-
cjc-version = "1.1.3"
|
|
3
|
-
compile-option = "--dy-std --cfg=\"${COMPILE_CONDITION_ENTRY}\""
|
|
4
|
-
description = "{{PROJECT_NAME}} - cj-tauri 鸿蒙入 module"
|
|
5
|
-
name = "ohos_app_cangjie_entry"
|
|
6
|
-
output-type = "dynamic"
|
|
7
|
-
src-dir = "./src/main/cangjie"
|
|
8
|
-
target-dir = ""
|
|
9
|
-
version = "1.0.0"
|
|
10
|
-
|
|
11
|
-
[dependencies]
|
|
12
|
-
# 源码依赖:hvigor 的 CompileCangjie 会把框架各包按本模块(dynamic)需要的形态编进来。
|
|
13
|
-
# 路径由 `cj-tauri create --template ohos` 写成**本机绝对路径**;换机器 / 挪仓库后重跑一次
|
|
14
|
-
# create,或手改这一行(与桌面模板同一条规矩)。
|
|
15
|
-
cjTauri = { path = "{{FRAMEWORK_ROOT_TOML}}" }
|
|
16
|
-
|
|
17
|
-
[profile]
|
|
18
|
-
[profile.build]
|
|
19
|
-
incremental = true
|
|
20
|
-
lto = ""
|
|
21
|
-
[profile.customized-option]
|
|
22
|
-
debug = "-g -Woff all -Won apilevel-check"
|
|
23
|
-
release = "--fast-math -O2 -s -Woff all -Won apilevel-check"
|
|
24
|
-
[profile.test]
|
|
25
|
-
|
|
26
|
-
[target.aarch64-linux-ohos]
|
|
27
|
-
compile-option = "-B \"${DEVECO_CANGJIE_HOME}/build-tools/third_party/llvm/bin\" -B \"${DEVECO_OH_NATIVE_HOME}/sysroot/usr/lib/aarch64-linux-ohos\" -L \"${DEVECO_OH_NATIVE_HOME}/sysroot/usr/lib/aarch64-linux-ohos\" -L \"${DEVECO_OH_NATIVE_HOME}/llvm/lib/clang/15.0.4/lib/aarch64-linux-ohos\" -L \"${DEVECO_OH_NATIVE_HOME}/llvm/lib/aarch64-linux-ohos\" --sysroot \"${DEVECO_OH_NATIVE_HOME}/sysroot\""
|
|
28
|
-
[target.aarch64-linux-ohos.bin-dependencies]
|
|
29
|
-
# 鸿蒙版 stdx:这里写**相对路径**,指向工程根上的 `stdx` 联接(build-hap.sh 用
|
|
30
|
-
# CANGJIE_STDX_OHOS 建,不入库)。两条实测依据:
|
|
31
|
-
# ① hvigor 只替换它自己的模板变量(${AARCH64_LIBS} 这组),写别的 ${...} 会变成空串,
|
|
32
|
-
# 而空串会让**整条 path-option 一起失效**,报错却是
|
|
33
|
-
# 「imports package 'stdx.encoding.json' ... not added as a dependency」,看着像漏配;
|
|
34
|
-
# ② 本机绝对路径能编过,但换机器就得改文件,而 DevEco 里点 Build 不经过脚本——
|
|
35
|
-
# 相对路径两处都通用。
|
|
36
|
-
path-option = ["${AARCH64_LIBS}", "${AARCH64_MACRO_LIBS}", "${AARCH64_KIT_LIBS}", "../stdx"]
|
|
37
|
-
package-option = {}
|
|
38
|
-
|
|
39
|
-
[target.x86_64-linux-ohos]
|
|
40
|
-
compile-option = "-B \"${DEVECO_CANGJIE_HOME}/build-tools/third_party/llvm/bin\" -B \"${DEVECO_OH_NATIVE_HOME}/sysroot/usr/lib/x86_64-linux-ohos\" -L \"${DEVECO_OH_NATIVE_HOME}/sysroot/usr/lib/x86_64-linux-ohos\" -L \"${DEVECO_OH_NATIVE_HOME}/llvm/lib/clang/15.0.4/lib/x86_64-linux-ohos\" -L \"${DEVECO_OH_NATIVE_HOME}/llvm/lib/x86_64-linux-ohos\" --sysroot \"${DEVECO_OH_NATIVE_HOME}/sysroot\""
|
|
41
|
-
[target.x86_64-linux-ohos.bin-dependencies]
|
|
42
|
-
path-option = ["${X86_64_OHOS_LIBS}", "${X86_64_OHOS_MACRO_LIBS}", "${X86_64_OHOS_KIT_LIBS}", "../stdx"]
|
|
43
|
-
package-option = {}
|
|
1
|
+
[package]
|
|
2
|
+
cjc-version = "1.1.3"
|
|
3
|
+
compile-option = "--dy-std --cfg=\"${COMPILE_CONDITION_ENTRY}\""
|
|
4
|
+
description = "{{PROJECT_NAME}} - cj-tauri 鸿蒙入 module"
|
|
5
|
+
name = "ohos_app_cangjie_entry"
|
|
6
|
+
output-type = "dynamic"
|
|
7
|
+
src-dir = "./src/main/cangjie"
|
|
8
|
+
target-dir = ""
|
|
9
|
+
version = "1.0.0"
|
|
10
|
+
|
|
11
|
+
[dependencies]
|
|
12
|
+
# 源码依赖:hvigor 的 CompileCangjie 会把框架各包按本模块(dynamic)需要的形态编进来。
|
|
13
|
+
# 路径由 `cj-tauri create --template ohos` 写成**本机绝对路径**;换机器 / 挪仓库后重跑一次
|
|
14
|
+
# create,或手改这一行(与桌面模板同一条规矩)。
|
|
15
|
+
cjTauri = { path = "{{FRAMEWORK_ROOT_TOML}}" }
|
|
16
|
+
|
|
17
|
+
[profile]
|
|
18
|
+
[profile.build]
|
|
19
|
+
incremental = true
|
|
20
|
+
lto = ""
|
|
21
|
+
[profile.customized-option]
|
|
22
|
+
debug = "-g -Woff all -Won apilevel-check"
|
|
23
|
+
release = "--fast-math -O2 -s -Woff all -Won apilevel-check"
|
|
24
|
+
[profile.test]
|
|
25
|
+
|
|
26
|
+
[target.aarch64-linux-ohos]
|
|
27
|
+
compile-option = "-B \"${DEVECO_CANGJIE_HOME}/build-tools/third_party/llvm/bin\" -B \"${DEVECO_OH_NATIVE_HOME}/sysroot/usr/lib/aarch64-linux-ohos\" -L \"${DEVECO_OH_NATIVE_HOME}/sysroot/usr/lib/aarch64-linux-ohos\" -L \"${DEVECO_OH_NATIVE_HOME}/llvm/lib/clang/15.0.4/lib/aarch64-linux-ohos\" -L \"${DEVECO_OH_NATIVE_HOME}/llvm/lib/aarch64-linux-ohos\" --sysroot \"${DEVECO_OH_NATIVE_HOME}/sysroot\""
|
|
28
|
+
[target.aarch64-linux-ohos.bin-dependencies]
|
|
29
|
+
# 鸿蒙版 stdx:这里写**相对路径**,指向工程根上的 `stdx` 联接(build-hap.sh 用
|
|
30
|
+
# CANGJIE_STDX_OHOS 建,不入库)。两条实测依据:
|
|
31
|
+
# ① hvigor 只替换它自己的模板变量(${AARCH64_LIBS} 这组),写别的 ${...} 会变成空串,
|
|
32
|
+
# 而空串会让**整条 path-option 一起失效**,报错却是
|
|
33
|
+
# 「imports package 'stdx.encoding.json' ... not added as a dependency」,看着像漏配;
|
|
34
|
+
# ② 本机绝对路径能编过,但换机器就得改文件,而 DevEco 里点 Build 不经过脚本——
|
|
35
|
+
# 相对路径两处都通用。
|
|
36
|
+
path-option = ["${AARCH64_LIBS}", "${AARCH64_MACRO_LIBS}", "${AARCH64_KIT_LIBS}", "../stdx"]
|
|
37
|
+
package-option = {}
|
|
38
|
+
|
|
39
|
+
[target.x86_64-linux-ohos]
|
|
40
|
+
compile-option = "-B \"${DEVECO_CANGJIE_HOME}/build-tools/third_party/llvm/bin\" -B \"${DEVECO_OH_NATIVE_HOME}/sysroot/usr/lib/x86_64-linux-ohos\" -L \"${DEVECO_OH_NATIVE_HOME}/sysroot/usr/lib/x86_64-linux-ohos\" -L \"${DEVECO_OH_NATIVE_HOME}/llvm/lib/clang/15.0.4/lib/x86_64-linux-ohos\" -L \"${DEVECO_OH_NATIVE_HOME}/llvm/lib/x86_64-linux-ohos\" --sysroot \"${DEVECO_OH_NATIVE_HOME}/sysroot\""
|
|
41
|
+
[target.x86_64-linux-ohos.bin-dependencies]
|
|
42
|
+
path-option = ["${X86_64_OHOS_LIBS}", "${X86_64_OHOS_MACRO_LIBS}", "${X86_64_OHOS_KIT_LIBS}", "../stdx"]
|
|
43
|
+
package-option = {}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { hapTasks } from '@ohos/hvigor-ohos-plugin';
|
|
2
|
-
|
|
3
|
-
export default {
|
|
4
|
-
system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */
|
|
5
|
-
plugins: [] /* Custom plugin to extend the functionality of Hvigor. */
|
|
6
|
-
}
|
|
1
|
+
import { hapTasks } from '@ohos/hvigor-ohos-plugin';
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */
|
|
5
|
+
plugins: [] /* Custom plugin to extend the functionality of Hvigor. */
|
|
6
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "entry",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"description": "{{PROJECT_NAME}} - entry 模块",
|
|
5
|
-
"main": "",
|
|
6
|
-
"author": "",
|
|
7
|
-
"license": "",
|
|
8
|
-
"dependencies": {}
|
|
9
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "entry",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "{{PROJECT_NAME}} - entry 模块",
|
|
5
|
+
"main": "",
|
|
6
|
+
"author": "",
|
|
7
|
+
"license": "",
|
|
8
|
+
"dependencies": {}
|
|
9
|
+
}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
package ohos_app_cangjie_entry
|
|
2
|
-
|
|
3
|
-
import kit.AbilityKit.AbilityStage
|
|
4
|
-
import kit.PerformanceAnalysisKit.Hilog
|
|
5
|
-
|
|
6
|
-
/*
|
|
7
|
-
* AbilityStage:模块级入口(module.json5 的 srcEntry 指向它)
|
|
8
|
-
*
|
|
9
|
-
* 只打一行 hilog。鸿蒙侧排查的第一句话是「AbilityStage 有没有被创建」——
|
|
10
|
-
* 应用启动即崩(比如框架包初始化链坏了)时,hilog 里连这一行都没有,
|
|
11
|
-
* 而 CANGJIE-RUNTIME 的行照常在,很容易被误读成「生命周期卡死」。
|
|
12
|
-
*/
|
|
13
|
-
class MyAbilityStage <: AbilityStage {
|
|
14
|
-
public override func onCreate(): Unit {
|
|
15
|
-
Hilog.info(1, "CjTauri", "MyAbilityStage onCreated.")
|
|
16
|
-
}
|
|
17
|
-
}
|
|
1
|
+
package ohos_app_cangjie_entry
|
|
2
|
+
|
|
3
|
+
import kit.AbilityKit.AbilityStage
|
|
4
|
+
import kit.PerformanceAnalysisKit.Hilog
|
|
5
|
+
|
|
6
|
+
/*
|
|
7
|
+
* AbilityStage:模块级入口(module.json5 的 srcEntry 指向它)
|
|
8
|
+
*
|
|
9
|
+
* 只打一行 hilog。鸿蒙侧排查的第一句话是「AbilityStage 有没有被创建」——
|
|
10
|
+
* 应用启动即崩(比如框架包初始化链坏了)时,hilog 里连这一行都没有,
|
|
11
|
+
* 而 CANGJIE-RUNTIME 的行照常在,很容易被误读成「生命周期卡死」。
|
|
12
|
+
*/
|
|
13
|
+
class MyAbilityStage <: AbilityStage {
|
|
14
|
+
public override func onCreate(): Unit {
|
|
15
|
+
Hilog.info(1, "CjTauri", "MyAbilityStage onCreated.")
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -1,94 +1,94 @@
|
|
|
1
|
-
package ohos_app_cangjie_entry
|
|
2
|
-
|
|
3
|
-
import cjTauri.*
|
|
4
|
-
import stdx.encoding.json.*
|
|
5
|
-
import kit.PerformanceAnalysisKit.Hilog
|
|
6
|
-
|
|
7
|
-
/*
|
|
8
|
-
* {{PROJECT_NAME}} 的框架装配(鸿蒙侧)
|
|
9
|
-
*
|
|
10
|
-
* 桌面的 `main()` 在鸿蒙上不成立——鸿蒙应用没有「自己起进程跑一个 main」这回事,
|
|
11
|
-
* 窗口属于 ArkUI、页面由 ArkWeb 组件承载。所以装配被拆成三段:
|
|
12
|
-
* ① `MainAbility.onCreate`:定沙箱目录(`run(html)` 要把页面落到沙箱再 file:// 加载)
|
|
13
|
-
* ② `MainAbility.onCreate` 里 `spawn { startTauriApp(...) }`:**必须非 UI 线程**,
|
|
14
|
-
* `run()` 会阻塞到 quit(),而 UI 线程要留给 ArkUI 建树
|
|
15
|
-
* ③ `onWindowStageCreate`:等宿主登记 → `loadContent` → 组件里建 `Web`
|
|
16
|
-
*
|
|
17
|
-
* 页面与能力清单的来路:都来自 hap 的 `resources/rawfile/`,由 Ability 读成字符串传进来
|
|
18
|
-
* (设备上没有 `ui/` 与 `capabilities/` 目录,这两份是构建期打进 hap 的)。
|
|
19
|
-
*/
|
|
20
|
-
|
|
21
|
-
/** greet 命令(对标 tauri command):前端 `tauri.invoke("greet", { name: "..." })` */
|
|
22
|
-
public class GreetCommand <: CommandHandler {
|
|
23
|
-
public init() {}
|
|
24
|
-
|
|
25
|
-
public func handle(cmd: String, args: JsonObject, ipc: IpcContext): JsonValue {
|
|
26
|
-
var name = "world"
|
|
27
|
-
if (let Some(n) <- args.get("name")) {
|
|
28
|
-
match (n.kind()) {
|
|
29
|
-
case JsonKind.JsString => name = n.asString().getValue()
|
|
30
|
-
case _ => ()
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
return JsonString("Hello, ${name}! 来自仓颉后端(鸿蒙 ArkWeb 宿主)")
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* 定时器命令:起一个后台线程,每秒向后端推一个 tick 事件(验证 仓颉 → JS 通道)
|
|
39
|
-
*
|
|
40
|
-
* 鸿蒙侧的 `emit` 同样只入队,真正的投递在 `onProxyPost` 里由页面心跳带出去——
|
|
41
|
-
* 所以页面必须一直在跑(`setInterval` 的心跳由框架的桥脚本负责,业务代码不用管)。
|
|
42
|
-
*/
|
|
43
|
-
public class TimerCommand <: CommandHandler {
|
|
44
|
-
private var counter: Int64 = 0
|
|
45
|
-
private var started: Bool = false
|
|
46
|
-
|
|
47
|
-
public init() {}
|
|
48
|
-
|
|
49
|
-
public func handle(cmd: String, args: JsonObject, ipc: IpcContext): JsonValue {
|
|
50
|
-
if (!this.started) {
|
|
51
|
-
this.started = true
|
|
52
|
-
spawn {
|
|
53
|
-
while (true) {
|
|
54
|
-
sleep(Duration.second)
|
|
55
|
-
this.counter += 1
|
|
56
|
-
var payload = JsonObject()
|
|
57
|
-
payload.put("n", JsonInt(this.counter))
|
|
58
|
-
ipc.emit("tick", payload)
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return JsonString("timer started")
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* 装配并运行框架应用(**必须在非 UI 线程调用**:`run()` 阻塞到 `quit()`)
|
|
68
|
-
*
|
|
69
|
-
* @param windowTitle 窗口标题(ArkUI 侧不起作用,留着与桌面版对齐)
|
|
70
|
-
* @param pageHtml 页面原文(rawfile/index.html)
|
|
71
|
-
* @param capsJson 能力清单原文(rawfile/capabilities.json);空串表示不挂清单
|
|
72
|
-
*/
|
|
73
|
-
public func startTauriApp(windowTitle: String, pageHtml: String, capsJson: String): Unit {
|
|
74
|
-
Hilog.info(1, "CjTauri", "startTauriApp begin page=${pageHtml.size}B caps=${capsJson.size}B")
|
|
75
|
-
|
|
76
|
-
let app = TauriApp()
|
|
77
|
-
.window(WindowConfig(windowTitle, 1280, 820))
|
|
78
|
-
.register("greet", GreetCommand())
|
|
79
|
-
.register("timer", TimerCommand())
|
|
80
|
-
|
|
81
|
-
// 显式挂载能力清单即不自动扫描目录——hap 里本来也没有 capabilities/ 这个目录。
|
|
82
|
-
if (capsJson.size > 0) {
|
|
83
|
-
app.addCapabilityJson(JsonValue.fromStr(capsJson))
|
|
84
|
-
Hilog.info(1, "CjTauri", "capability embedded bytes=${capsJson.size}")
|
|
85
|
-
} else {
|
|
86
|
-
// 空清单 = 一条命令都不放行(含 system:*),页面会看到「command not allowed」。
|
|
87
|
-
// 这比静默放行安全,也比假装成功好排查。
|
|
88
|
-
Hilog.info(1, "CjTauri", "capability missing: rawfile/capabilities.json 没打进 hap,所有命令都会被拒")
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// 阻塞到 quit():Ability 的生命周期仍归系统管,`run()` 返回不代表进程退出。
|
|
92
|
-
app.run(pageHtml)
|
|
93
|
-
Hilog.info(1, "CjTauri", "after run")
|
|
94
|
-
}
|
|
1
|
+
package ohos_app_cangjie_entry
|
|
2
|
+
|
|
3
|
+
import cjTauri.*
|
|
4
|
+
import stdx.encoding.json.*
|
|
5
|
+
import kit.PerformanceAnalysisKit.Hilog
|
|
6
|
+
|
|
7
|
+
/*
|
|
8
|
+
* {{PROJECT_NAME}} 的框架装配(鸿蒙侧)
|
|
9
|
+
*
|
|
10
|
+
* 桌面的 `main()` 在鸿蒙上不成立——鸿蒙应用没有「自己起进程跑一个 main」这回事,
|
|
11
|
+
* 窗口属于 ArkUI、页面由 ArkWeb 组件承载。所以装配被拆成三段:
|
|
12
|
+
* ① `MainAbility.onCreate`:定沙箱目录(`run(html)` 要把页面落到沙箱再 file:// 加载)
|
|
13
|
+
* ② `MainAbility.onCreate` 里 `spawn { startTauriApp(...) }`:**必须非 UI 线程**,
|
|
14
|
+
* `run()` 会阻塞到 quit(),而 UI 线程要留给 ArkUI 建树
|
|
15
|
+
* ③ `onWindowStageCreate`:等宿主登记 → `loadContent` → 组件里建 `Web`
|
|
16
|
+
*
|
|
17
|
+
* 页面与能力清单的来路:都来自 hap 的 `resources/rawfile/`,由 Ability 读成字符串传进来
|
|
18
|
+
* (设备上没有 `ui/` 与 `capabilities/` 目录,这两份是构建期打进 hap 的)。
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/** greet 命令(对标 tauri command):前端 `tauri.invoke("greet", { name: "..." })` */
|
|
22
|
+
public class GreetCommand <: CommandHandler {
|
|
23
|
+
public init() {}
|
|
24
|
+
|
|
25
|
+
public func handle(cmd: String, args: JsonObject, ipc: IpcContext): JsonValue {
|
|
26
|
+
var name = "world"
|
|
27
|
+
if (let Some(n) <- args.get("name")) {
|
|
28
|
+
match (n.kind()) {
|
|
29
|
+
case JsonKind.JsString => name = n.asString().getValue()
|
|
30
|
+
case _ => ()
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return JsonString("Hello, ${name}! 来自仓颉后端(鸿蒙 ArkWeb 宿主)")
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* 定时器命令:起一个后台线程,每秒向后端推一个 tick 事件(验证 仓颉 → JS 通道)
|
|
39
|
+
*
|
|
40
|
+
* 鸿蒙侧的 `emit` 同样只入队,真正的投递在 `onProxyPost` 里由页面心跳带出去——
|
|
41
|
+
* 所以页面必须一直在跑(`setInterval` 的心跳由框架的桥脚本负责,业务代码不用管)。
|
|
42
|
+
*/
|
|
43
|
+
public class TimerCommand <: CommandHandler {
|
|
44
|
+
private var counter: Int64 = 0
|
|
45
|
+
private var started: Bool = false
|
|
46
|
+
|
|
47
|
+
public init() {}
|
|
48
|
+
|
|
49
|
+
public func handle(cmd: String, args: JsonObject, ipc: IpcContext): JsonValue {
|
|
50
|
+
if (!this.started) {
|
|
51
|
+
this.started = true
|
|
52
|
+
spawn {
|
|
53
|
+
while (true) {
|
|
54
|
+
sleep(Duration.second)
|
|
55
|
+
this.counter += 1
|
|
56
|
+
var payload = JsonObject()
|
|
57
|
+
payload.put("n", JsonInt(this.counter))
|
|
58
|
+
ipc.emit("tick", payload)
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return JsonString("timer started")
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* 装配并运行框架应用(**必须在非 UI 线程调用**:`run()` 阻塞到 `quit()`)
|
|
68
|
+
*
|
|
69
|
+
* @param windowTitle 窗口标题(ArkUI 侧不起作用,留着与桌面版对齐)
|
|
70
|
+
* @param pageHtml 页面原文(rawfile/index.html)
|
|
71
|
+
* @param capsJson 能力清单原文(rawfile/capabilities.json);空串表示不挂清单
|
|
72
|
+
*/
|
|
73
|
+
public func startTauriApp(windowTitle: String, pageHtml: String, capsJson: String): Unit {
|
|
74
|
+
Hilog.info(1, "CjTauri", "startTauriApp begin page=${pageHtml.size}B caps=${capsJson.size}B")
|
|
75
|
+
|
|
76
|
+
let app = TauriApp()
|
|
77
|
+
.window(WindowConfig(windowTitle, 1280, 820))
|
|
78
|
+
.register("greet", GreetCommand())
|
|
79
|
+
.register("timer", TimerCommand())
|
|
80
|
+
|
|
81
|
+
// 显式挂载能力清单即不自动扫描目录——hap 里本来也没有 capabilities/ 这个目录。
|
|
82
|
+
if (capsJson.size > 0) {
|
|
83
|
+
app.addCapabilityJson(JsonValue.fromStr(capsJson))
|
|
84
|
+
Hilog.info(1, "CjTauri", "capability embedded bytes=${capsJson.size}")
|
|
85
|
+
} else {
|
|
86
|
+
// 空清单 = 一条命令都不放行(含 system:*),页面会看到「command not allowed」。
|
|
87
|
+
// 这比静默放行安全,也比假装成功好排查。
|
|
88
|
+
Hilog.info(1, "CjTauri", "capability missing: rawfile/capabilities.json 没打进 hap,所有命令都会被拒")
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// 阻塞到 quit():Ability 的生命周期仍归系统管,`run()` 返回不代表进程退出。
|
|
92
|
+
app.run(pageHtml)
|
|
93
|
+
Hilog.info(1, "CjTauri", "after run")
|
|
94
|
+
}
|