ms-vite-plugin 1.5.9 → 1.5.11

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.
@@ -5,7 +5,7 @@
5
5
  - 导入方式:
6
6
 
7
7
  ```python
8
- from kuaijs import action, cloud, hid, image, appleocr, paddleocr, yolo, yolocls, system, device, file, mysql, netcard, ime, media, hotupdate, tomatoocr, tts, ui, utils, node, pip, logger
8
+ from kuaijs import action, cloud, hid, image, appleocr, paddleocr, yolo, yolocls, system, device, file, mysql, netcard, ime, jbdylib, jbshell, media, hotupdate, tomatoocr, tts, ui, utils, node, pip, logger
9
9
  ```
10
10
 
11
11
  ## 标准库
@@ -1,13 +1,14 @@
1
1
  # 悬浮窗模块 (PIP)
2
2
 
3
- 悬浮窗模块提供 iOS 画中画(Picture in Picture)悬浮窗能力,可用于显示脚本日志、保活提示或脚本自定义文本。
3
+ 悬浮窗模块提供 iOS 悬浮窗能力。免越狱包使用系统画中画(Picture in Picture),可用于显示脚本日志、保活提示或脚本自定义文本。越狱包使用同一套 `pip` API 控制全局悬浮球:保活只显示图标,日志显示图标和日志窗口,自定义显示图标和自定义文本窗口。
4
4
 
5
5
  ## 功能特性
6
6
 
7
- - **显示模式**:支持日志、保活和自定义三种显示模式;首次安装默认保活
7
+ - **显示模式**:支持日志、保活和自定义三种显示模式;首次安装默认关闭
8
8
  - **关闭控制**:支持主动关闭悬浮窗
9
9
  - **状态查询**:判断悬浮窗是否正在显示
10
- - **尺寸设置**:日志模式和自定义模式支持设置内容宽高比(实际显示尺寸由系统决定),并按模式分别持久化
10
+ - **尺寸设置**:日志模式和自定义模式支持设置尺寸并分别持久化。系统画中画为宽高比(实际显示尺寸由系统决定);越狱包为窗口宽高(像素)
11
+ - **位置设置**:越狱包可用 `setPosition` 设置日志窗口和自定义文本窗口位置;保活模式不接受;系统画中画位置由 iOS 管理
11
12
  - **日志显示**:日志模式支持设置日志文字大小
12
13
  - **自定义文本**:自定义模式支持文本、换行、文字颜色、背景色和文字大小
13
14
 
@@ -38,7 +39,7 @@ if pip.isPipActive():
38
39
 
39
40
  ### switchToLogMode - 切换到日志模式
40
41
 
41
- 切换到日志模式并尝试显示悬浮窗日志窗口。首次显示悬浮窗时 App 必须在前台。日志模式会恢复最近一次保存的日志窗口尺寸。
42
+ 切换到日志模式并尝试显示悬浮窗日志窗口。首次显示系统画中画时 App 必须在前台。日志模式会恢复最近一次保存的日志窗口尺寸。越狱包显示悬浮球图标和日志窗口。
42
43
 
43
44
  ```python
44
45
  def switchToLogMode() -> bool
@@ -62,7 +63,7 @@ pip.setLogFontSize(10)
62
63
 
63
64
  ### switchToKeepAliveMode - 切换到保活模式
64
65
 
65
- 切换到保活模式并尝试显示极小高度悬浮窗。首次显示悬浮窗时 App 必须在前台。保活模式不接受脚本尺寸设置。
66
+ 切换到保活模式并尝试显示极小高度悬浮窗。首次显示系统画中画时 App 必须在前台。保活模式不接受脚本尺寸设置。越狱包只显示悬浮球图标。
66
67
 
67
68
  ```python
68
69
  def switchToKeepAliveMode() -> bool
@@ -85,7 +86,7 @@ success = pip.switchToKeepAliveMode()
85
86
 
86
87
  ### switchToCustomMode - 切换到自定义模式
87
88
 
88
- 切换到自定义模式并显示脚本设置的自定义文本。首次显示悬浮窗时 App 必须在前台。自定义模式会恢复最近一次保存的自定义窗口尺寸。
89
+ 切换到自定义模式并显示脚本设置的自定义文本。首次显示系统画中画时 App 必须在前台。自定义模式会恢复最近一次保存的自定义窗口尺寸。越狱包显示悬浮球图标和自定义文本窗口。
89
90
 
90
91
  ```python
91
92
  def switchToCustomMode() -> bool
@@ -133,7 +134,7 @@ success = pip.closeWindow()
133
134
 
134
135
  ### setContentSize - 设置内容尺寸
135
136
 
136
- 设置日志模式或自定义模式的悬浮窗内容尺寸。传入的宽高表示宽高比,不是最终像素尺寸;悬浮窗实际显示的宽高由系统决定。宽度和高度都必须传入有效数字。日志模式和自定义模式会分别保存尺寸;悬浮窗关闭状态和保活模式不会生效。
137
+ 设置日志模式或自定义模式的悬浮窗内容尺寸。系统画中画传入的宽高表示宽高比,不是最终像素尺寸,实际显示宽高由系统决定。越狱包传入的宽高是对应窗口的像素尺寸。宽度和高度都必须传入有效数字。日志模式和自定义模式会分别保存尺寸;关闭状态和保活模式不会生效。
137
138
 
138
139
  ```python
139
140
  def setContentSize(width: float, height: float) -> bool
@@ -143,8 +144,8 @@ def setContentSize(width: float, height: float) -> bool
143
144
 
144
145
  | 参数 | 类型 | 必填 | 描述 |
145
146
  | -------- | ---------------- | ---- | ----------------------------- |
146
- | `width` | `float` | 是 | 宽度方向比例值(与 `height` 共同决定宽高比,不是像素) |
147
- | `height` | `float` | 是 | 高度方向比例值(与 `width` 共同决定宽高比,不是像素) |
147
+ | `width` | `float` | 是 | 宽度。系统画中画为比例值;越狱包为窗口宽度(像素) |
148
+ | `height` | `float` | 是 | 高度。系统画中画为比例值;越狱包为窗口高度(像素) |
148
149
 
149
150
  **返回值:**
150
151
 
@@ -164,6 +165,36 @@ pip.switchToCustomMode()
164
165
  pip.setContentSize(120, 180)
165
166
  ```
166
167
 
168
+ ### setPosition - 设置位置
169
+
170
+ 设置悬浮窗位置。仅越狱包生效;系统画中画由 iOS 管理位置,调用返回 `False`。只对日志窗口和自定义文本窗口生效;保活模式不接受设置位置。
171
+
172
+ ```python
173
+ def setPosition(x: float, y: float) -> bool
174
+ ```
175
+
176
+ **参数:**
177
+
178
+ | 参数 | 类型 | 必填 | 描述 |
179
+ | ---- | ------- | ---- | ------------------ |
180
+ | `x` | `float` | 是 | 窗口左上角逻辑 X |
181
+ | `y` | `float` | 是 | 窗口左上角逻辑 Y |
182
+
183
+ **返回值:**
184
+
185
+ | 类型 | 描述 |
186
+ | ------ | --------------------------------------------------- |
187
+ | `bool` | `True` 代表位置已提交;`False` 代表当前不能设置位置 |
188
+
189
+ **示例:**
190
+
191
+ ```python
192
+ from kuaijs import pip
193
+
194
+ pip.switchToLogMode()
195
+ pip.setPosition(24, 120)
196
+ ```
197
+
167
198
  ### setLogFontSize - 设置日志文字大小
168
199
 
169
200
  设置日志模式显示文本的文字大小。该方法只更新日志字号,不会自动切换到日志模式。
@@ -330,9 +361,9 @@ pip.setContentSize(120, 180)
330
361
 
331
362
  ## 注意事项
332
363
 
333
- 1. **前台限制**:首次切换到日志、保活或自定义显示模式并启动悬浮窗时,App 必须在前台;悬浮窗已启动后可以继续切换显示模式或关闭悬浮窗
334
- 2. **设备兼容性**:仅支持 iOS 15+ 且具备画中画功能的设备
335
- 3. **系统限制**:悬浮窗位置和实际显示尺寸由 iOS 管理
364
+ 1. **前台限制**:系统画中画首次切换到日志、保活或自定义显示模式并启动悬浮窗时,App 必须在前台;悬浮窗已启动后可以继续切换显示模式或关闭悬浮窗
365
+ 2. **设备兼容性**:系统画中画仅支持 iOS 15+ 且具备画中画功能的设备;越狱包全局悬浮球不依赖系统画中画
366
+ 3. **位置**:系统画中画位置由 iOS 管理;越狱包日志/自定义窗口可用 `setPosition`,保活模式不接受
336
367
  4. **尺寸持久化**:日志模式和自定义模式分别保存尺寸,互不共用;保活模式不接受脚本尺寸
337
368
  5. **日志字号**:日志字号只影响日志模式,保活模式和自定义模式不受影响
338
369
  6. **竖向文本**:自定义窗口高度大于宽度时,文本会按逐字符换行方式竖向显示
@@ -341,11 +372,17 @@ pip.setContentSize(120, 180)
341
372
 
342
373
  ### 悬浮窗无法显示
343
374
 
344
- - 确认设备支持悬浮窗功能
345
- - 检查悬浮窗权限是否已开启
346
- - 确认应用当前在前台
375
+ - 确认当前已切换到日志、保活或自定义模式,且不是关闭状态
376
+ - 系统画中画:确认设备支持悬浮窗功能,并检查悬浮窗权限是否已开启
377
+ - 系统画中画:确认应用当前在前台
347
378
 
348
379
  ### setContentSize 返回 False
349
380
 
350
381
  - 确认当前模式是日志模式或自定义模式
351
382
  - 确认宽度和高度都传入了有效数字
383
+
384
+ ### setPosition 返回 False
385
+
386
+ - 确认当前是越狱包,且已切换到日志或自定义模式,对应窗口已打开
387
+ - 保活模式不支持设置位置
388
+ - 确认 x、y 都传入了有效数字
@@ -0,0 +1,152 @@
1
+ # 属性列表模块 (Plist)
2
+
3
+ 路径必须是绝对路径。
4
+
5
+ ## API 参考
6
+
7
+ ### read - 读取整个 plist
8
+
9
+ ```python
10
+ from typing import Any, Optional
11
+
12
+ def read(path: str) -> Optional[Any]
13
+ ```
14
+
15
+ **参数:**
16
+
17
+ | 参数名 | 类型 | 是否必填 | 描述 |
18
+ | ------ | ----- | -------- | ------------ |
19
+ | `path` | `str` | 是 | 文件绝对路径 |
20
+
21
+ **返回值:**
22
+
23
+ | 类型 | 描述 |
24
+ | --------------- | ------ |
25
+ | `Any` \| `None` | 根对象 |
26
+
27
+ **示例:**
28
+
29
+ ```python
30
+ from kuaijs import file, plist
31
+ path = file.getInternalDir("documents") + "/info.plist"
32
+ info = plist.read(path)
33
+ ```
34
+
35
+ ### write - 写成 plist
36
+
37
+ ```python
38
+ from typing import Any, Optional
39
+
40
+ def write(path: str, value: Any, format: Optional[str] = None) -> bool
41
+ ```
42
+
43
+ **参数:**
44
+
45
+ | 参数名 | 类型 | 是否必填 | 描述 |
46
+ | -------- | --------------- | -------- | ------------------------------ |
47
+ | `path` | `str` | 是 | 文件绝对路径 |
48
+ | `value` | `Any` | 是 | dict、list、字符串、数字或布尔 |
49
+ | `format` | `str` \| `None` | 否 | `xml` 或 `binary`,默认 xml |
50
+
51
+ **返回值:**
52
+
53
+ | 类型 | 描述 |
54
+ | ------ | ----------------- |
55
+ | `bool` | 写入成功为 `True` |
56
+
57
+ **示例:**
58
+
59
+ ```python
60
+ from kuaijs import file, plist
61
+ 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
+ ```python
69
+ from typing import Any, List, Optional, Union
70
+
71
+ def get(path: str, key: Union[str, List[str]]) -> Optional[Any]
72
+ ```
73
+
74
+ **参数:**
75
+
76
+ | 参数名 | 类型 | 是否必填 | 描述 |
77
+ | ------ | -------------------- | -------- | ---------------- |
78
+ | `path` | `str` | 是 | 文件绝对路径 |
79
+ | `key` | `str` \| `List[str]` | 是 | 键,或嵌套键列表 |
80
+
81
+ **返回值:**
82
+
83
+ | 类型 | 描述 |
84
+ | --------------- | -------- |
85
+ | `Any` \| `None` | 该键的值 |
86
+
87
+ **示例:**
88
+
89
+ ```python
90
+ from kuaijs import plist
91
+ plist.get(path, "name")
92
+ plist.get(path, ["a", "b"])
93
+ ```
94
+
95
+ ### set - 按键写入
96
+
97
+ ```python
98
+ from typing import Any, List, Union
99
+
100
+ def set(path: str, key: Union[str, List[str]], value: Any) -> bool
101
+ ```
102
+
103
+ **参数:**
104
+
105
+ | 参数名 | 类型 | 是否必填 | 描述 |
106
+ | ------- | -------------------- | -------- | ---------------- |
107
+ | `path` | `str` | 是 | 文件绝对路径 |
108
+ | `key` | `str` \| `List[str]` | 是 | 键,或嵌套键列表 |
109
+ | `value` | `Any` | 是 | 要写入的值 |
110
+
111
+ **返回值:**
112
+
113
+ | 类型 | 描述 |
114
+ | ------ | ----------------- |
115
+ | `bool` | 写入成功为 `True` |
116
+
117
+ **示例:**
118
+
119
+ ```python
120
+ from kuaijs import plist
121
+ plist.set(path, "name", "kuaijs")
122
+ plist.set(path, ["a", "b"], 1)
123
+ ```
124
+
125
+ ### remove - 按键删除
126
+
127
+ ```python
128
+ from typing import List, Union
129
+
130
+ def remove(path: str, key: Union[str, List[str]]) -> bool
131
+ ```
132
+
133
+ **参数:**
134
+
135
+ | 参数名 | 类型 | 是否必填 | 描述 |
136
+ | ------ | -------------------- | -------- | ---------------- |
137
+ | `path` | `str` | 是 | 文件绝对路径 |
138
+ | `key` | `str` \| `List[str]` | 是 | 键,或嵌套键列表 |
139
+
140
+ **返回值:**
141
+
142
+ | 类型 | 描述 |
143
+ | ------ | ----------------- |
144
+ | `bool` | 删除成功为 `True` |
145
+
146
+ **示例:**
147
+
148
+ ```python
149
+ from kuaijs import plist
150
+ plist.remove(path, "name")
151
+ plist.remove(path, ["a", "b"])
152
+ ```
@@ -125,6 +125,51 @@ ui.call("loadData", {
125
125
  })
126
126
  ```
127
127
 
128
+ ### callFloatingWindow - 调用越狱悬浮窗网页中的 JavaScript 函数
129
+
130
+ ```python
131
+ def callFloatingWindow(key: str, data: dict) -> None
132
+ ```
133
+
134
+ 调用悬浮窗网页里 `registerUIFunc` 注册的函数。主界面 WebView 不受影响。没有悬浮窗网页时无效果。
135
+
136
+ **参数:**
137
+
138
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
139
+ | ------ | ---- | -------- | ------ | ------------------------ |
140
+ | `key` | str | 是 | | 悬浮窗页面 JavaScript 方法名 |
141
+ | `data` | dict | 是 | | 传递给方法的参数 |
142
+
143
+ **示例:**
144
+
145
+ ```python
146
+ from kuaijs import ui
147
+
148
+ ui.callFloatingWindow("updateStatus", {"status": "running", "progress": 50})
149
+ ```
150
+
151
+ ### evalFloatingWindow - 在越狱悬浮窗网页中执行 JavaScript
152
+
153
+ ```python
154
+ def evalFloatingWindow(code: str) -> None
155
+ ```
156
+
157
+ 在悬浮窗网页中执行 JavaScript。主界面 WebView 不受影响。没有悬浮窗网页时无效果。
158
+
159
+ **参数:**
160
+
161
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
162
+ | ------ | ---- | -------- | ------ | -------------------- |
163
+ | `code` | str | 是 | | JavaScript 代码字符串 |
164
+
165
+ **示例:**
166
+
167
+ ```python
168
+ from kuaijs import ui
169
+
170
+ ui.evalFloatingWindow("console.log('float')")
171
+ ```
172
+
128
173
  ### showToast - 显示 Toast 提示消息
129
174
 
130
175
  ```python
@@ -668,6 +713,30 @@ ms.getDeviceID()
668
713
  });
669
714
  ```
670
715
 
716
+ #### getOrientation - 获取屏幕方向
717
+
718
+ ```typescript
719
+ declare function getOrientation(): Promise<"PORTRAIT" | "LANDSCAPE">;
720
+ ```
721
+
722
+ **返回值:**
723
+
724
+ | 类型 | 描述 |
725
+ | ------------------------------------------- | ------------------------------------------------------------ |
726
+ | `Promise<"PORTRAIT" \| "LANDSCAPE">` | `"PORTRAIT"` 竖屏,`"LANDSCAPE"` 横屏 |
727
+
728
+ **说明:**
729
+
730
+ 获取当前屏幕方向。
731
+
732
+ **网页端示例:**
733
+
734
+ ```javascript
735
+ ms.getOrientation().then((orientation) => {
736
+ console.log(orientation);
737
+ });
738
+ ```
739
+
671
740
  #### openURL - 调用浏览器打开 URL
672
741
 
673
742
  ```typescript
@@ -707,6 +776,55 @@ ms.openURL("https://www.baidu.com")
707
776
  });
708
777
  ```
709
778
 
779
+ #### setWebWindowSize - 设置网页窗口宽高
780
+
781
+ ```typescript
782
+ declare function setWebWindowSize(size: {
783
+ portraitWidth: number;
784
+ portraitHeight: number;
785
+ landscapeWidth: number;
786
+ landscapeHeight: number;
787
+ }): Promise<boolean>;
788
+ ```
789
+
790
+ **参数:**
791
+
792
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
793
+ | ------ | ------ | -------- | ------ | ------------------------ |
794
+ | `size` | object | 是 | | 横竖屏网页窗口像素尺寸 |
795
+
796
+ **`size` 字段:**
797
+
798
+ | 字段名 | 类型 | 是否必填 | 默认值 | 描述 |
799
+ | ----------------- | ------ | -------- | ------ | ---------------------- |
800
+ | `portraitWidth` | number | 是 | | 竖屏窗口宽度(像素) |
801
+ | `portraitHeight` | number | 是 | | 竖屏窗口高度(像素) |
802
+ | `landscapeWidth` | number | 是 | | 横屏窗口宽度(像素) |
803
+ | `landscapeHeight` | number | 是 | | 横屏窗口高度(像素) |
804
+
805
+ **返回值:**
806
+
807
+ | 类型 | 描述 |
808
+ | ------------------ | ------------------------------------- |
809
+ | `Promise<boolean>` | 如果设置成功返回 true,否则返回 false |
810
+
811
+ **说明:**
812
+
813
+ 仅越狱包可用。一次同时设置竖屏和横屏的网页窗口像素尺寸。未调用过时,横竖屏都默认使用对应朝向屏幕宽高的 60%。免越狱包调用返回 `false`。
814
+
815
+ **网页端示例:**
816
+
817
+ ```javascript
818
+ ms.setWebWindowSize({
819
+ portraitWidth: 700,
820
+ portraitHeight: 1200,
821
+ landscapeWidth: 1200,
822
+ landscapeHeight: 700,
823
+ }).then((ok) => {
824
+ console.log(ok);
825
+ });
826
+ ```
827
+
710
828
  ### 完整示例
711
829
 
712
830
  **完整的控制面板示例:**
@@ -787,7 +787,7 @@ GET /api/status
787
787
  | »» isHidConnected | boolean | true | none | hid设备是否连接 | none |
788
788
  | »» isShowUI | boolean | true | none | 实现显示了 UI | none |
789
789
  | »» isLogin | boolean | true | none | 是否登录 | none |
790
- | »» deviceId | string | true | none | 设备 ID,应用唯一,卸载重装变化 | none |
790
+ | »» deviceId | string | true | none | 设备 ID | 越狱包为芯片生成的固定 ID,免越狱包为 IDFV |
791
791
 
792
792
  #### 枚举值
793
793
 
@@ -3378,7 +3378,7 @@ GET /mirror/image
3378
3378
  | isHidConnected | boolean | true | none | hid设备是否连接 | none |
3379
3379
  | isShowUI | boolean | true | none | 实现显示了 UI | none |
3380
3380
  | isLogin | boolean | true | none | 是否登录 | none |
3381
- | deviceId | string | true | none | 设备 ID,应用唯一,卸载重装变化 | none |
3381
+ | deviceId | string | true | none | 设备 ID | 越狱包为芯片生成的固定 ID,免越狱包为 IDFV |
3382
3382
 
3383
3383
  #### 枚举值
3384
3384
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ms-vite-plugin",
3
- "version": "1.5.9",
3
+ "version": "1.5.11",
4
4
  "type": "commonjs",
5
5
  "license": "MIT",
6
6
  "publishConfig": {