ms-vite-plugin 1.5.8 → 1.5.10

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.
Files changed (43) hide show
  1. package/dist/cli.js +6 -6
  2. package/dist/packaging/index.d.ts +4 -1
  3. package/dist/packaging/index.js +1 -1
  4. package/docs/api/device.md +5 -9
  5. package/docs/api/global.md +2 -2
  6. package/docs/api/jbclear.md +291 -0
  7. package/docs/api/jbdevice.md +574 -0
  8. package/docs/api/jbdylib.md +219 -0
  9. package/docs/api/jbshell.md +59 -0
  10. package/docs/api/jbsystem.md +211 -0
  11. package/docs/api/jbvpn.md +219 -0
  12. package/docs/api/pip.md +50 -15
  13. package/docs/api/plist.md +137 -0
  14. package/docs/api/ui.md +114 -0
  15. package/docs/apicn/device.md +4 -8
  16. package/docs/apicn/global.md +2 -2
  17. package/docs/apicn/pip.md +50 -15
  18. package/docs/apicn/ui.md +114 -0
  19. package/docs/apilua/device.md +5 -9
  20. package/docs/apilua/global.md +2 -2
  21. package/docs/apilua/jbclear.md +313 -0
  22. package/docs/apilua/jbdevice.md +609 -0
  23. package/docs/apilua/jbdylib.md +231 -0
  24. package/docs/apilua/jbshell.md +63 -0
  25. package/docs/apilua/jbsystem.md +225 -0
  26. package/docs/apilua/jbvpn.md +233 -0
  27. package/docs/apilua/pip.md +53 -15
  28. package/docs/apilua/plist.md +153 -0
  29. package/docs/apilua/ui.md +117 -0
  30. package/docs/apipython/device.md +6 -8
  31. package/docs/apipython/g.md +1 -1
  32. package/docs/apipython/jbclear.md +288 -0
  33. package/docs/apipython/jbdevice.md +570 -0
  34. package/docs/apipython/jbdylib.md +215 -0
  35. package/docs/apipython/jbshell.md +61 -0
  36. package/docs/apipython/jbsystem.md +216 -0
  37. package/docs/apipython/jbvpn.md +231 -0
  38. package/docs/apipython/overview.md +1 -1
  39. package/docs/apipython/pip.md +52 -15
  40. package/docs/apipython/plist.md +152 -0
  41. package/docs/apipython/ui.md +118 -0
  42. package/docs/httpapi/api.md +2 -2
  43. package/package.json +1 -1
@@ -0,0 +1,233 @@
1
+ # VPN 模块 (JBVPN)
2
+
3
+ 模块表是内置全局 `jbvpn`,直接调用即可。不要 `require` 宿主模块。
4
+
5
+ 仅越狱包可用。免越狱包没有 `jbvpn`。
6
+
7
+ 管理系统 VPN 配置:创建、列出、读取当前选中、选中、删除、连接、断开,以及读取当前选中配置的状态。类型支持 `L2TP`、`IPSec`、`IKEv2`。
8
+
9
+ `create` 必填显示名、类型和服务器。`select` / `remove` / `connect` 可传显示名,或 `list` 返回的 `id`。多条配置同名时不保证操作哪一条,精确操作请用 `id`。
10
+
11
+ `connect` / `disconnect` 返回 `true` 只表示已经开始,不表示已经连上或已经断开。用 `status` 看 `connected`。没有选中配置时,`connect()`、`disconnect()`、`status()` 失败。
12
+
13
+ ## API 参考
14
+
15
+ ### create - 创建一条系统 VPN 配置。
16
+
17
+ ```lua
18
+ ---@param config table
19
+ ---@return boolean
20
+ function create(config) end
21
+ ```
22
+
23
+ **参数:**
24
+
25
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
26
+ | -------- | ------ | -------- | ------ | ------------------------------------- |
27
+ | `config` | `table` | 是 | - | 配置表。必填 `name`、`type`、`server` |
28
+
29
+ `config` 字段:
30
+
31
+ | 字段名 | 类型 | 是否必填 | 默认值 | 描述 |
32
+ | ----------------- | --------- | -------- | ------ | ------------------------------- |
33
+ | `name` | `string` | 是 | - | 显示名 |
34
+ | `type` | `string` | 是 | - | `L2TP` / `IPSec` / `IKEv2` |
35
+ | `server` | `string` | 是 | - | 服务器地址 |
36
+ | `account` | `string` | 否 | `""` | 账号 |
37
+ | `password` | `string` | 否 | `""` | 密码 |
38
+ | `secret` | `string` | 否 | `""` | 共享密钥。L2TP / IPSec 常用 |
39
+ | `group` | `string` | 否 | `""` | 群组名称 |
40
+ | `sendAllTraffic` | `boolean` | 否 | `true` | 是否发送所有流量 |
41
+ | `encryptionLevel` | `integer` | 否 | `1` | 加密级别 |
42
+ | `localId` | `string` | 否 | `""` | 本端标识。IKEv2 可用 |
43
+ | `remoteId` | `string` | 否 | `""` | 对端标识。IKEv2 可用 |
44
+
45
+ **返回值:**
46
+
47
+ | 类型 | 描述 |
48
+ | --------- | --------------- |
49
+ | `boolean` | 成功为 `true` |
50
+
51
+ **示例:**
52
+
53
+ ```lua
54
+ local ok = jbvpn.create({
55
+ name = "Demo",
56
+ type = "L2TP",
57
+ server = "vpn.example.com",
58
+ account = "user",
59
+ password = "pass",
60
+ secret = "psk",
61
+ })
62
+ ```
63
+
64
+ ### list - 列出当前系统 VPN 配置。
65
+
66
+ ```lua
67
+ ---@return table|nil
68
+ function list() end
69
+ ```
70
+
71
+ **返回值:**
72
+
73
+ | 类型 | 描述 |
74
+ | -------------- | --------------------------- |
75
+ | `table \| nil` | 配置列表;读失败返回 `nil` |
76
+
77
+ 没有配置时是空表。每项含 `name`、`id`。
78
+
79
+ **示例:**
80
+
81
+ ```lua
82
+ local items = jbvpn.list()
83
+ if items then
84
+ for _, item in ipairs(items) do
85
+ print(item.name, item.id)
86
+ end
87
+ end
88
+ ```
89
+
90
+ ### current - 读取当前选中的 VPN 配置。
91
+
92
+ 没有选中配置返回 `nil`。
93
+
94
+ ```lua
95
+ ---@return table|nil
96
+ function current() end
97
+ ```
98
+
99
+ **返回值:**
100
+
101
+ | 类型 | 描述 |
102
+ | -------------- | ----------------------------------------- |
103
+ | `table \| nil` | 含 `name`、`id`;没有选中配置返回 `nil` |
104
+
105
+ **示例:**
106
+
107
+ ```lua
108
+ local item = jbvpn.current()
109
+ if item then
110
+ print(item.name, item.id)
111
+ end
112
+ ```
113
+
114
+ ### select - 选中一条 VPN 配置。
115
+
116
+ ```lua
117
+ ---@param nameOrId string
118
+ ---@return boolean
119
+ function select(nameOrId) end
120
+ ```
121
+
122
+ **参数:**
123
+
124
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
125
+ | ----------- | -------- | -------- | ------ | ----------------------- |
126
+ | `nameOrId` | `string` | 是 | - | 显示名或 `list` 的 `id` |
127
+
128
+ **返回值:**
129
+
130
+ | 类型 | 描述 |
131
+ | --------- | --------------------- |
132
+ | `boolean` | 找到并选中为 `true` |
133
+
134
+ **示例:**
135
+
136
+ ```lua
137
+ jbvpn.select("Demo")
138
+ ```
139
+
140
+ ### remove - 删除一条 VPN 配置。
141
+
142
+ ```lua
143
+ ---@param nameOrId string
144
+ ---@return boolean
145
+ function remove(nameOrId) end
146
+ ```
147
+
148
+ **参数:**
149
+
150
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
151
+ | ----------- | -------- | -------- | ------ | ----------------------- |
152
+ | `nameOrId` | `string` | 是 | - | 显示名或 `list` 的 `id` |
153
+
154
+ **返回值:**
155
+
156
+ | 类型 | 描述 |
157
+ | --------- | --------------------- |
158
+ | `boolean` | 找到并删除为 `true` |
159
+
160
+ **示例:**
161
+
162
+ ```lua
163
+ jbvpn.remove("Demo")
164
+ ```
165
+
166
+ ### connect - 连接 VPN。
167
+
168
+ 传入显示名或 `id` 时先选中再连接;省略则连接当前选中的配置。
169
+
170
+ ```lua
171
+ ---@param nameOrId? string
172
+ ---@return boolean
173
+ function connect(nameOrId) end
174
+ ```
175
+
176
+ **参数:**
177
+
178
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
179
+ | ----------- | -------- | -------- | ------ | ----------------------------- |
180
+ | `nameOrId` | `string` | 否 | - | 显示名或 `id`;省略用当前选中 |
181
+
182
+ **返回值:**
183
+
184
+ | 类型 | 描述 |
185
+ | --------- | --------------------------------------- |
186
+ | `boolean` | 开始连接为 `true`,不是已经连上 |
187
+
188
+ **示例:**
189
+
190
+ ```lua
191
+ jbvpn.connect("Demo")
192
+ ```
193
+
194
+ ### disconnect - 断开当前 VPN 连接。
195
+
196
+ ```lua
197
+ ---@return boolean
198
+ function disconnect() end
199
+ ```
200
+
201
+ **返回值:**
202
+
203
+ | 类型 | 描述 |
204
+ | --------- | --------------------------------------- |
205
+ | `boolean` | 开始断开为 `true`,不是已经断开 |
206
+
207
+ **示例:**
208
+
209
+ ```lua
210
+ jbvpn.disconnect()
211
+ ```
212
+
213
+ ### status - 读取当前选中 VPN 的状态。
214
+
215
+ ```lua
216
+ ---@return table|nil
217
+ function status() end
218
+ ```
219
+
220
+ **返回值:**
221
+
222
+ | 类型 | 描述 |
223
+ | -------------- | --------------------------------------------- |
224
+ | `table \| nil` | 含 `text`、`connected`;没有选中配置返回 `nil` |
225
+
226
+ **示例:**
227
+
228
+ ```lua
229
+ local st = jbvpn.status()
230
+ if st and st.connected then
231
+ print(st.text)
232
+ end
233
+ ```
@@ -2,14 +2,15 @@
2
2
 
3
3
  模块表是内置全局 `pip`,直接调用即可。不要 `require` 宿主模块。
4
4
 
5
- 悬浮窗模块提供 iOS 画中画(Picture in Picture)悬浮窗能力,可用于显示脚本日志、保活提示或脚本自定义文本。
5
+ 悬浮窗模块提供 iOS 悬浮窗能力。免越狱包使用系统画中画(Picture in Picture),可用于显示脚本日志、保活提示或脚本自定义文本。越狱包使用同一套 `pip` API 控制全局悬浮球:保活只显示图标,日志显示图标和日志窗口,自定义显示图标和自定义文本窗口。
6
6
 
7
7
  ## 功能特性
8
8
 
9
- - **显示模式**:支持日志、保活和自定义三种显示模式;首次安装默认保活
9
+ - **显示模式**:支持日志、保活和自定义三种显示模式;首次安装默认关闭
10
10
  - **关闭控制**:支持主动关闭悬浮窗
11
11
  - **状态查询**:判断悬浮窗是否正在显示
12
- - **尺寸设置**:日志模式和自定义模式支持设置内容宽高比(实际显示尺寸由系统决定),并按模式分别持久化
12
+ - **尺寸设置**:日志模式和自定义模式支持设置尺寸并分别持久化。系统画中画为宽高比(实际显示尺寸由系统决定);越狱包为窗口宽高(像素)
13
+ - **位置设置**:越狱包可用 `setPosition` 设置日志窗口和自定义文本窗口位置;保活模式不接受;系统画中画位置由 iOS 管理
13
14
  - **日志显示**:日志模式支持设置日志文字大小
14
15
  - **自定义文本**:自定义模式支持文本、换行、文字颜色、背景色和文字大小
15
16
 
@@ -46,7 +47,7 @@ end
46
47
  function switchToLogMode() end
47
48
  ```
48
49
 
49
- 切换到日志模式并尝试显示悬浮窗日志窗口。首次显示悬浮窗时 App 必须在前台。日志模式会恢复最近一次保存的日志窗口尺寸。
50
+ 切换到日志模式并尝试显示悬浮窗日志窗口。首次显示系统画中画时 App 必须在前台。日志模式会恢复最近一次保存的日志窗口尺寸。越狱包显示悬浮球图标和日志窗口。
50
51
 
51
52
  **返回值:**
52
53
 
@@ -69,7 +70,7 @@ pip.setLogFontSize(10)
69
70
  function switchToKeepAliveMode() end
70
71
  ```
71
72
 
72
- 切换到保活模式并尝试显示极小高度悬浮窗。首次显示悬浮窗时 App 必须在前台。保活模式不接受脚本尺寸设置。
73
+ 切换到保活模式并尝试显示极小高度悬浮窗。首次显示系统画中画时 App 必须在前台。保活模式不接受脚本尺寸设置。越狱包只显示悬浮球图标。
73
74
 
74
75
  **返回值:**
75
76
 
@@ -91,7 +92,7 @@ local success = pip.switchToKeepAliveMode()
91
92
  function switchToCustomMode() end
92
93
  ```
93
94
 
94
- 切换到自定义模式并显示脚本设置的自定义文本。首次显示悬浮窗时 App 必须在前台。自定义模式会恢复最近一次保存的自定义窗口尺寸。
95
+ 切换到自定义模式并显示脚本设置的自定义文本。首次显示系统画中画时 App 必须在前台。自定义模式会恢复最近一次保存的自定义窗口尺寸。越狱包显示悬浮球图标和自定义文本窗口。
95
96
 
96
97
  **返回值:**
97
98
 
@@ -139,14 +140,14 @@ local success = pip.closeWindow()
139
140
  function setContentSize(width, height) end
140
141
  ```
141
142
 
142
- 设置日志模式或自定义模式的悬浮窗内容尺寸。传入的宽高表示宽高比,不是最终像素尺寸;悬浮窗实际显示的宽高由系统决定。宽度和高度都必须传入有效数字。日志模式和自定义模式会分别保存尺寸;悬浮窗关闭状态和保活模式不会生效。
143
+ 设置日志模式或自定义模式的悬浮窗内容尺寸。系统画中画传入的宽高表示宽高比,不是最终像素尺寸,实际显示宽高由系统决定。越狱包传入的宽高是对应窗口的像素尺寸。宽度和高度都必须传入有效数字。日志模式和自定义模式会分别保存尺寸;关闭状态和保活模式不会生效。
143
144
 
144
145
  **参数:**
145
146
 
146
147
  | 参数 | 类型 | 必填 | 描述 |
147
148
  | -------- | ---------------- | ---- | ---------------------------------------------- |
148
- | `width` | `number` | 是 | 宽度方向比例值(与 `height` 共同决定宽高比,不是像素) |
149
- | `height` | `number` | 是 | 高度方向比例值(与 `width` 共同决定宽高比,不是像素) |
149
+ | `width` | `number` | 是 | 宽度。系统画中画为比例值;越狱包为窗口宽度(像素) |
150
+ | `height` | `number` | 是 | 高度。系统画中画为比例值;越狱包为窗口高度(像素) |
150
151
 
151
152
  **返回值:**
152
153
 
@@ -164,6 +165,37 @@ pip.switchToCustomMode()
164
165
  pip.setContentSize(120, 180)
165
166
  ```
166
167
 
168
+ ### setPosition - 设置位置
169
+
170
+ ```lua
171
+ ---@param x number
172
+ ---@param y number
173
+ ---@return boolean
174
+ function setPosition(x, y) end
175
+ ```
176
+
177
+ 设置悬浮窗位置。仅越狱包生效;系统画中画由 iOS 管理位置,调用返回 `false`。只对日志窗口和自定义文本窗口生效;保活模式不接受设置位置。
178
+
179
+ **参数:**
180
+
181
+ | 参数 | 类型 | 必填 | 描述 |
182
+ | ---- | -------- | ---- | ------------------ |
183
+ | `x` | `number` | 是 | 窗口左上角逻辑 X |
184
+ | `y` | `number` | 是 | 窗口左上角逻辑 Y |
185
+
186
+ **返回值:**
187
+
188
+ | 类型 | 描述 |
189
+ | --------- | --------------------------------------------------- |
190
+ | `boolean` | `true` 代表位置已提交;`false` 代表当前不能设置位置 |
191
+
192
+ **示例:**
193
+
194
+ ```lua
195
+ pip.switchToLogMode()
196
+ pip.setPosition(24, 120)
197
+ ```
198
+
167
199
  ### setLogFontSize - 设置日志文字大小
168
200
 
169
201
  ```lua
@@ -328,9 +360,9 @@ pip.setContentSize(120, 180)
328
360
 
329
361
  ## 注意事项
330
362
 
331
- 1. **前台限制**:首次切换到日志、保活或自定义显示模式并启动悬浮窗时,App 必须在前台;悬浮窗已启动后可以继续切换显示模式或关闭悬浮窗
332
- 2. **设备兼容性**:仅支持 iOS 15+ 且具备画中画功能的设备
333
- 3. **系统限制**:悬浮窗位置和实际显示尺寸由 iOS 管理
363
+ 1. **前台限制**:系统画中画首次切换到日志、保活或自定义显示模式并启动悬浮窗时,App 必须在前台;悬浮窗已启动后可以继续切换显示模式或关闭悬浮窗
364
+ 2. **设备兼容性**:系统画中画仅支持 iOS 15+ 且具备画中画功能的设备;越狱包全局悬浮球不依赖系统画中画
365
+ 3. **位置**:系统画中画位置由 iOS 管理;越狱包日志/自定义窗口可用 `setPosition`,保活模式不接受
334
366
  4. **尺寸持久化**:日志模式和自定义模式分别保存尺寸,互不共用;保活模式不接受脚本尺寸
335
367
  5. **日志字号**:日志字号只影响日志模式,保活模式和自定义模式不受影响
336
368
  6. **竖向文本**:自定义窗口高度大于宽度时,文本会按逐字符换行方式竖向显示
@@ -339,11 +371,17 @@ pip.setContentSize(120, 180)
339
371
 
340
372
  ### 悬浮窗无法显示
341
373
 
342
- - 确认设备支持悬浮窗功能
343
- - 检查悬浮窗权限是否已开启
344
- - 确认应用当前在前台
374
+ - 确认当前已切换到日志、保活或自定义模式,且不是关闭状态
375
+ - 系统画中画:确认设备支持悬浮窗功能,并检查悬浮窗权限是否已开启
376
+ - 系统画中画:确认应用当前在前台
345
377
 
346
378
  ### setContentSize 返回 false
347
379
 
348
380
  - 确认当前模式是日志模式或自定义模式
349
381
  - 确认宽度和高度都传入了有效数字
382
+
383
+ ### setPosition 返回 false
384
+
385
+ - 确认当前是越狱包,且已切换到日志或自定义模式,对应窗口已打开
386
+ - 保活模式不支持设置位置
387
+ - 确认 x、y 都传入了有效数字
@@ -0,0 +1,153 @@
1
+ # 属性列表模块 (Plist)
2
+
3
+ 模块表是内置全局 `plist`,直接调用即可。不要 `require` 宿主模块。路径必须是绝对路径。
4
+
5
+ ## API 参考
6
+
7
+ ### read - 读取整个 plist。
8
+
9
+ ```lua
10
+ ---@param path string
11
+ ---@return any|nil
12
+ function read(path) end
13
+ ```
14
+
15
+ **参数:**
16
+
17
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
18
+ | ------ | -------- | -------- | ------ | ------------ |
19
+ | `path` | `string` | 是 | - | 文件绝对路径 |
20
+
21
+ **返回值:**
22
+
23
+ | 类型 | 描述 |
24
+ | -------------- | -------- |
25
+ | `any` \| `nil` | 根对象 |
26
+
27
+ **示例:**
28
+
29
+ ```lua
30
+ local path = file.getInternalDir("documents") .. "/info.plist"
31
+ local info = plist.read(path)
32
+ ```
33
+
34
+ ### write - 写成 plist。
35
+
36
+ ```lua
37
+ ---@param path string
38
+ ---@param value any
39
+ ---@param format string|nil
40
+ ---@return boolean
41
+ function write(path, value, format) end
42
+ ```
43
+
44
+ **参数:**
45
+
46
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
47
+ | -------- | ----------------- | -------- | ------- | ---------------------- |
48
+ | `path` | `string` | 是 | - | 文件绝对路径 |
49
+ | `value` | `any` | 是 | - | 表、字符串、数字或布尔 |
50
+ | `format` | `string` \| `nil` | 否 | `"xml"` | `xml` 或 `binary` |
51
+
52
+ **返回值:**
53
+
54
+ | 类型 | 描述 |
55
+ | --------- | ----------------- |
56
+ | `boolean` | 写入成功为 `true` |
57
+
58
+ **示例:**
59
+
60
+ ```lua
61
+ local path = file.getInternalDir("documents") .. "/info.plist"
62
+ plist.write(path, { name = "kuaijs", count = 1 })
63
+ plist.write(path, { name = "kuaijs" }, "binary")
64
+ ```
65
+
66
+ ### get - 按键读取。
67
+
68
+ ```lua
69
+ ---@param path string
70
+ ---@param key string|string[]
71
+ ---@return any|nil
72
+ function get(path, key) end
73
+ ```
74
+
75
+ **参数:**
76
+
77
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
78
+ | ------ | ---------------------- | -------- | ------ | ------------------ |
79
+ | `path` | `string` | 是 | - | 文件绝对路径 |
80
+ | `key` | `string` \| `string[]` | 是 | - | 键,或嵌套键数组表 |
81
+
82
+ **返回值:**
83
+
84
+ | 类型 | 描述 |
85
+ | -------------- | -------- |
86
+ | `any` \| `nil` | 该键的值 |
87
+
88
+ **示例:**
89
+
90
+ ```lua
91
+ plist.get(path, "name")
92
+ plist.get(path, { "a", "b" })
93
+ ```
94
+
95
+ ### set - 按键写入。
96
+
97
+ ```lua
98
+ ---@param path string
99
+ ---@param key string|string[]
100
+ ---@param value any
101
+ ---@return boolean
102
+ function set(path, key, value) end
103
+ ```
104
+
105
+ **参数:**
106
+
107
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
108
+ | ------- | ---------------------- | -------- | ------ | ------------------ |
109
+ | `path` | `string` | 是 | - | 文件绝对路径 |
110
+ | `key` | `string` \| `string[]` | 是 | - | 键,或嵌套键数组表 |
111
+ | `value` | `any` | 是 | - | 要写入的值 |
112
+
113
+ **返回值:**
114
+
115
+ | 类型 | 描述 |
116
+ | --------- | ----------------- |
117
+ | `boolean` | 写入成功为 `true` |
118
+
119
+ **示例:**
120
+
121
+ ```lua
122
+ plist.set(path, "name", "kuaijs")
123
+ plist.set(path, { "a", "b" }, 1)
124
+ ```
125
+
126
+ ### remove - 按键删除。
127
+
128
+ ```lua
129
+ ---@param path string
130
+ ---@param key string|string[]
131
+ ---@return boolean
132
+ function remove(path, key) end
133
+ ```
134
+
135
+ **参数:**
136
+
137
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
138
+ | ------ | ---------------------- | -------- | ------ | ------------------ |
139
+ | `path` | `string` | 是 | - | 文件绝对路径 |
140
+ | `key` | `string` \| `string[]` | 是 | - | 键,或嵌套键数组表 |
141
+
142
+ **返回值:**
143
+
144
+ | 类型 | 描述 |
145
+ | --------- | ----------------- |
146
+ | `boolean` | 删除成功为 `true` |
147
+
148
+ **示例:**
149
+
150
+ ```lua
151
+ plist.remove(path, "name")
152
+ plist.remove(path, { "a", "b" })
153
+ ```
package/docs/apilua/ui.md CHANGED
@@ -104,6 +104,27 @@ function eval(code) end
104
104
  ui.eval("document.title = 'KuaiJS'")
105
105
  ```
106
106
 
107
+ ### evalFloatingWindow - 在越狱悬浮窗网页中执行 JavaScript
108
+
109
+ ```lua
110
+ ---@param code string
111
+ function evalFloatingWindow(code) end
112
+ ```
113
+
114
+ 在悬浮窗网页中执行 JavaScript。主界面 WebView 不受影响。没有悬浮窗网页时无效果。
115
+
116
+ **参数:**
117
+
118
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
119
+ | ------ | ------ | -------- | ------ | -------------------- |
120
+ | `code` | string | 是 | - | JavaScript 代码字符串 |
121
+
122
+ **示例:**
123
+
124
+ ```lua
125
+ ui.evalFloatingWindow("console.log('float')")
126
+ ```
127
+
107
128
  ### onEvent - 设置事件回调函数
108
129
 
109
130
  ```lua
@@ -154,6 +175,29 @@ ui.call("loadData", {
154
175
  })
155
176
  ```
156
177
 
178
+ ### callFloatingWindow - 调用越狱悬浮窗网页中的 JavaScript 函数
179
+
180
+ ```lua
181
+ ---@param key string
182
+ ---@param data table
183
+ function callFloatingWindow(key, data) end
184
+ ```
185
+
186
+ 调用悬浮窗网页里 `registerUIFunc` 注册的函数。主界面 WebView 不受影响。没有悬浮窗网页时无效果。
187
+
188
+ **参数:**
189
+
190
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
191
+ | ------ | ------ | -------- | ------ | ------------------------ |
192
+ | `key` | string | 是 | | 悬浮窗页面 JavaScript 方法名 |
193
+ | `data` | table | 是 | | 传递给方法的参数 |
194
+
195
+ **示例:**
196
+
197
+ ```lua
198
+ ui.callFloatingWindow("updateStatus", { status = "running", progress = 50 })
199
+ ```
200
+
157
201
  ### showToast - 显示 Toast 提示消息
158
202
 
159
203
  ```lua
@@ -693,6 +737,30 @@ ms.getDeviceID()
693
737
  });
694
738
  ```
695
739
 
740
+ #### getOrientation - 获取屏幕方向
741
+
742
+ ```typescript
743
+ declare function getOrientation(): Promise<"PORTRAIT" | "LANDSCAPE">;
744
+ ```
745
+
746
+ **返回值:**
747
+
748
+ | 类型 | 描述 |
749
+ | ------------------------------------------- | ------------------------------------------------------------ |
750
+ | `Promise<"PORTRAIT" \| "LANDSCAPE">` | `"PORTRAIT"` 竖屏,`"LANDSCAPE"` 横屏 |
751
+
752
+ **说明:**
753
+
754
+ 获取当前屏幕方向。
755
+
756
+ **网页端示例:**
757
+
758
+ ```javascript
759
+ ms.getOrientation().then((orientation) => {
760
+ console.log(orientation);
761
+ });
762
+ ```
763
+
696
764
  #### getAuthCardNo - 获取缓存的授权卡密
697
765
 
698
766
  ```typescript
@@ -757,6 +825,55 @@ ms.openURL("https://www.baidu.com")
757
825
  });
758
826
  ```
759
827
 
828
+ #### setWebWindowSize - 设置网页窗口宽高
829
+
830
+ ```typescript
831
+ declare function setWebWindowSize(size: {
832
+ portraitWidth: number;
833
+ portraitHeight: number;
834
+ landscapeWidth: number;
835
+ landscapeHeight: number;
836
+ }): Promise<boolean>;
837
+ ```
838
+
839
+ **参数:**
840
+
841
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
842
+ | ------ | ------ | -------- | ------ | ------------------------ |
843
+ | `size` | object | 是 | | 横竖屏网页窗口像素尺寸 |
844
+
845
+ **`size` 字段:**
846
+
847
+ | 字段名 | 类型 | 是否必填 | 默认值 | 描述 |
848
+ | ----------------- | ------ | -------- | ------ | ---------------------- |
849
+ | `portraitWidth` | number | 是 | | 竖屏窗口宽度(像素) |
850
+ | `portraitHeight` | number | 是 | | 竖屏窗口高度(像素) |
851
+ | `landscapeWidth` | number | 是 | | 横屏窗口宽度(像素) |
852
+ | `landscapeHeight` | number | 是 | | 横屏窗口高度(像素) |
853
+
854
+ **返回值:**
855
+
856
+ | 类型 | 描述 |
857
+ | ------------------ | ------------------------------------- |
858
+ | `Promise<boolean>` | 如果设置成功返回 true,否则返回 false |
859
+
860
+ **说明:**
861
+
862
+ 仅越狱包可用。一次同时设置竖屏和横屏的网页窗口像素尺寸。未调用过时,横竖屏都默认使用对应朝向屏幕宽高的 60%。免越狱包调用返回 `false`。
863
+
864
+ **网页端示例:**
865
+
866
+ ```javascript
867
+ ms.setWebWindowSize({
868
+ portraitWidth: 700,
869
+ portraitHeight: 1200,
870
+ landscapeWidth: 1200,
871
+ landscapeHeight: 700,
872
+ }).then((ok) => {
873
+ console.log(ok);
874
+ });
875
+ ```
876
+
760
877
  ### 完整示例
761
878
 
762
879
  **完整的控制面板示例:**
@@ -69,21 +69,19 @@ print(f"剩余存储: {s.free}{s.unit}")
69
69
 
70
70
  ## 设备标识信息
71
71
 
72
- ### getDeviceID - 获取设备唯一标识(Vendor ID)。
72
+ ### getDeviceID - 获取设备 ID。
73
+
74
+ 越狱包返回芯片生成的固定 ID,卸载重装不变;免越狱包返回 IDFV,卸载重装会改变。
73
75
 
74
76
  ```python
75
77
  def getDeviceID() -> str
76
78
  ```
77
79
 
78
- **注意事项:**
79
-
80
- - 卸载重装 APP 后会改变;更新 APP 后不会改变
81
-
82
80
  **返回值:**
83
81
 
84
- | 类型 | 描述 |
85
- | ----- | ----------- |
86
- | `str` | 设备唯一 ID |
82
+ | 类型 | 描述 |
83
+ | ----- | ------- |
84
+ | `str` | 设备 ID |
87
85
 
88
86
  **示例:**
89
87
 
@@ -12,7 +12,7 @@
12
12
  ## 常量
13
13
 
14
14
  - `runMode: str` 运行模式,"agent" 或 "hid"
15
- - `platform: str` 平台信息("ios" 或 "android")
15
+ - `platform: str` 免越狱包为 `"ios"`,越狱包为 `"ios_jb"`
16
16
  - `appVersion: str` 应用版本号
17
17
  - `appBuildNumber: int` 应用构建号
18
18
  - `appName: str` 应用名称