@docoi/mys-sdk 1.0.2 → 1.1.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 +212 -0
- package/dist/api/basic.d.ts +208 -111
- package/dist/api/biz.d.ts +162 -25
- package/dist/api/router/index.d.ts +68 -0
- package/dist/api/router/launch.d.ts +3 -0
- package/dist/api/router/legacy.d.ts +22 -0
- package/dist/api/router/routes.d.ts +732 -0
- package/dist/bridge.d.ts +48 -9
- package/dist/constants/code.d.ts +10 -2
- package/dist/index.d.ts +21 -41
- package/dist/index.mjs +1241 -308
- package/dist/transport/legacy.d.ts +27 -0
- package/dist/types/base.d.ts +77 -5
- package/dist/types/enums.d.ts +39 -17
- package/dist/types/index.d.ts +2 -3
- package/dist/types/params.d.ts +135 -87
- package/dist/types/results.d.ts +205 -55
- package/dist/types/router.d.ts +231 -0
- package/dist/utils/app.d.ts +30 -0
- package/dist/utils/data.d.ts +39 -0
- package/package.json +9 -9
- package/LICENSE +0 -21
package/README.md
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
# @docoi/mys-sdk
|
|
2
|
+
|
|
3
|
+
H5 与梦游社 App 原生通信的 SDK。封装 JSBridge,对外提供类微信小程序风格的 API:全部 Promise 化,同时兼容 `success` / `fail` / `complete` 回调。
|
|
4
|
+
|
|
5
|
+
- **类型完备** — 每个 API 都有类型声明与 JSDoc,IDE 里悬浮即可看到说明、最低可用版本和调用示例
|
|
6
|
+
- **新旧通道自动兼容** — App 4.4.0 前后的通信方式不同,由 SDK 按各 API 的起始版本在内部选择,业务侧不需要判断版本
|
|
7
|
+
- **零配置** — 不需要初始化,import 即用
|
|
8
|
+
|
|
9
|
+
## 安装
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
pnpm add @docoi/mys-sdk
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## 快速开始
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
import mys from '@docoi/mys-sdk'
|
|
19
|
+
|
|
20
|
+
// 显示提示框
|
|
21
|
+
await mys.showToast({ text: '操作成功' })
|
|
22
|
+
|
|
23
|
+
// 获取系统信息
|
|
24
|
+
const { result } = await mys.getSystemInfo()
|
|
25
|
+
console.log(result.app_version, result.network_type)
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## 引入方式
|
|
29
|
+
|
|
30
|
+
两种写法等价,指向同一份实现,按团队习惯选一种:
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
// 聚合对象
|
|
34
|
+
import mys from '@docoi/mys-sdk'
|
|
35
|
+
await mys.showToast({ text: 'hi' })
|
|
36
|
+
|
|
37
|
+
// 命名导入
|
|
38
|
+
import { showToast } from '@docoi/mys-sdk'
|
|
39
|
+
await showToast({ text: 'hi' })
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## 返回值
|
|
43
|
+
|
|
44
|
+
所有 API 返回 `Promise<NativeResponse<TResult>>`,`code` 为 `0` 才算成功:
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
interface NativeResponse<TResult> {
|
|
48
|
+
code: number // 0 表示成功
|
|
49
|
+
msg: string // 成功时固定为 'ok'
|
|
50
|
+
result: TResult // 业务数据
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
```ts
|
|
55
|
+
const res = await mys.chooseMedia({ count: 3 })
|
|
56
|
+
console.log(res.result.tempFiles[0].tempFilePath)
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## 错误处理
|
|
60
|
+
|
|
61
|
+
失败时 Promise reject,同时触发 `fail` 和 `complete` 回调,拿到的是 `ApiError`:
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
interface ApiError {
|
|
65
|
+
errCode: number
|
|
66
|
+
errMsg: string // 形如 `showToast:fail parameter error: text is required`
|
|
67
|
+
errDetail?: unknown // 排查用的原始数据,仅部分场景存在
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
try {
|
|
73
|
+
await mys.getClipboardData()
|
|
74
|
+
} catch (err) {
|
|
75
|
+
const { errCode, errMsg } = err as ApiError
|
|
76
|
+
console.error(errCode, errMsg)
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
`errCode` 语义如下,常量可从 `@docoi/mys-sdk` 的 `constants/code` 导入:
|
|
81
|
+
|
|
82
|
+
| 码 | 常量 | 含义 |
|
|
83
|
+
| ---- | ------------------ | ------------------------------------------------ |
|
|
84
|
+
| 0 | `SUCCESS` | 成功 |
|
|
85
|
+
| -1 | `SYSTEM_EXCEPTION` | 未知异常 |
|
|
86
|
+
| 1001 | `METHOD_NOT_FOUND` | App 没有这个方法 |
|
|
87
|
+
| 1002 | `PARAMS_ERROR` | 参数校验失败,SDK 前置判定,不会发起调用 |
|
|
88
|
+
| 2002 | `NOT_LOGGED_IN` | 未登录、Token 失效 |
|
|
89
|
+
| 3002 | `PERMISSION_DENIED`| 权限被拒 |
|
|
90
|
+
| 4002 | `NETWORK_ERROR` | 网络异常 |
|
|
91
|
+
| 5001 | `BRIDGE_ERROR` | 通信链路不通:不在 App 内,或原生通道不存在 |
|
|
92
|
+
| 5002 | `ENV_UNSUPPORTED` | 当前 App 版本没有该能力,SDK 前置判定,不会发起调用 |
|
|
93
|
+
| 9002 | `CUSTOM` | 其他业务失败 |
|
|
94
|
+
| 9101 | `RECORD_BUSY` | 录音进行中,需要先调 `cancelRecordAudio` |
|
|
95
|
+
| 9102 | `RECORD_FAILED` | 录音失败 |
|
|
96
|
+
|
|
97
|
+
## 回调风格
|
|
98
|
+
|
|
99
|
+
所有 API 都接受 `success` / `fail` / `complete`,与 Promise 同时生效:
|
|
100
|
+
|
|
101
|
+
```ts
|
|
102
|
+
mys.getSystemInfo({
|
|
103
|
+
success(res) {
|
|
104
|
+
console.log(res.result.app_version)
|
|
105
|
+
},
|
|
106
|
+
fail(err) {
|
|
107
|
+
console.error(err.errMsg)
|
|
108
|
+
},
|
|
109
|
+
complete(res) {
|
|
110
|
+
console.log('调用结束')
|
|
111
|
+
},
|
|
112
|
+
})
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## 事件监听
|
|
116
|
+
|
|
117
|
+
监听类 API 用 `onXxx` 注册、`offXxx` 注销。回调直接收到原生事件的数据,不包装 `code` / `msg` / `result`:
|
|
118
|
+
|
|
119
|
+
```ts
|
|
120
|
+
mys.onKeyboardHeightChange((height) => {
|
|
121
|
+
console.log('键盘高度', height)
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
mys.offKeyboardHeightChange() // 不传参取消该事件下全部监听
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
只和某一次调用相关的事件,作为该次调用的参数传入,由 SDK 自动释放,不需要也不提供单独的 on/off:
|
|
128
|
+
|
|
129
|
+
```ts
|
|
130
|
+
await mys.shareWebCard({
|
|
131
|
+
title: '标题',
|
|
132
|
+
content: '内容',
|
|
133
|
+
icon: 'https://example.com/icon.png',
|
|
134
|
+
shareUrl: 'https://docoi.cc',
|
|
135
|
+
daokeUrl: 'daoke://page?type=5&h5Type=4&url=https://docoi.cc',
|
|
136
|
+
externalContent: '内容',
|
|
137
|
+
onShared: (res) => console.log('分享完成', res?.shareChannel),
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
await mys.startRecordAudio({
|
|
141
|
+
maxDuration: 60,
|
|
142
|
+
onProgress: ({ decibel }) => console.log('音量', decibel),
|
|
143
|
+
onEnd: ({ tempFilePath, duration, size }) => console.log(tempFilePath, duration, size),
|
|
144
|
+
})
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## API 一览
|
|
148
|
+
|
|
149
|
+
| 分组 | API |
|
|
150
|
+
| ------------ | ---------------------------------------------------------------------------------------------------------- |
|
|
151
|
+
| UI 交互 | `showToast` `triggerVibrate` `stopVibrate` `hideKeyboard` `onKeyboardHeightChange` / `offKeyboardHeightChange` `onCommentPanelChange` / `offCommentPanelChange` |
|
|
152
|
+
| 媒体能力 | `previewImage` `previewVideo` `chooseMedia` `uploadFiles` `saveImageToPhotosAlbum` `startRecordAudio` `stopRecordAudio` `cancelRecordAudio` |
|
|
153
|
+
| 设备能力 | `getSystemInfo` `setClipboardData` `getClipboardData` `checkPermission` `openPhoneSetting` |
|
|
154
|
+
| 应用与页面 | `openApp` `swipeBack` `showPageName` |
|
|
155
|
+
| 页面生命周期 | `h5Loaded` `getBeforeInfo` `setBeforeInfo` `onPageShow` / `offPageShow` `onPageVisible` / `offPageVisible` `onPageInvisible` / `offPageInvisible` |
|
|
156
|
+
| 页面跳转 | `switchTab` `navigateTo` `openWebview` `openInExternalBrowser` `closeWebView` `openScheme` |
|
|
157
|
+
| 账号与用户 | `login` `getToken` `getCurrentCircleInfo` |
|
|
158
|
+
| 内容与分享 | `shareWebCard` `shareImage` `openAddCustomEmoji` `openCommentPanel` `showLongVipDesDialog` `voteAction` `openFriendsList` |
|
|
159
|
+
| 业务场景 | `toBindGameRole` `bindGameRoleSuccess` `showAd` `onAdFinished` / `offAdFinished` `updateData` `openGiftBag` `onMemberActivate` / `offMemberActivate` |
|
|
160
|
+
| 工具 | `setDebug` `registerNativeHandler` |
|
|
161
|
+
|
|
162
|
+
`getAppBaseInfo` / `isInApp` / `compareVersions` 用来读 App 环境信息,`ToastDuration` / `ShareType` 是枚举值。`onRoute` / `invokeDebug` 仅供仓库内的 Demo 调试,不承诺兼容,业务侧不要依赖。
|
|
163
|
+
|
|
164
|
+
## App 版本兼容
|
|
165
|
+
|
|
166
|
+
每个 API 的 JSDoc 里用 `@app` 标了最低可用版本。低于这个版本时:
|
|
167
|
+
|
|
168
|
+
- **有旧接口的**(如 `login`、`showToast`、`previewImage`)由 SDK 自动改走旧通道,业务侧无感知
|
|
169
|
+
- **没有旧接口的**(如 `chooseMedia`、`uploadFiles`、录音系列)直接以 `5002` 失败,不发起调用
|
|
170
|
+
|
|
171
|
+
所以调用前一般不需要自己判断版本;确实要分支时用 `compareVersions`,它把入参与当前 App 版本比较(注意正负号与直觉相反):
|
|
172
|
+
|
|
173
|
+
```ts
|
|
174
|
+
import { compareVersions } from '@docoi/mys-sdk'
|
|
175
|
+
|
|
176
|
+
// compareVersions('4.4.0'):当前 App 版本更高返回 1,相等返回 0,更低返回 -1
|
|
177
|
+
if (compareVersions('4.4.0') >= 0) {
|
|
178
|
+
await mys.uploadFiles({ files: ['mysFile://temp/xxx.png'] })
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## 运行环境
|
|
183
|
+
|
|
184
|
+
- 产物语法基线 **ES2018**(Safari 12 / Chrome 63)。构建链会转译的可以直接用;直接引 CDN 或老构建链不转译 `node_modules` 时,需要自行保证运行时支持该基线
|
|
185
|
+
- 必须在 App 的 WebView 内使用。浏览器里通信类 API 会以 `5001` 失败;页面跳转类会尝试唤起 App
|
|
186
|
+
- 只提供 ESM 产物,不提供 CommonJS
|
|
187
|
+
- 无第三方运行时依赖(`@docoi/jsbridge-sdk` 是唯一依赖)
|
|
188
|
+
|
|
189
|
+
## TypeScript
|
|
190
|
+
|
|
191
|
+
类型随包一起发布,参数和返回值都有提示:
|
|
192
|
+
|
|
193
|
+
```ts
|
|
194
|
+
import type { ShowToastParams, NativeResponse, ApiError } from '@docoi/mys-sdk'
|
|
195
|
+
import { ToastDuration, ShareType } from '@docoi/mys-sdk'
|
|
196
|
+
|
|
197
|
+
const params: ShowToastParams = { text: 'hi', duration: ToastDuration.Long }
|
|
198
|
+
|
|
199
|
+
await mys.shareWebCard({
|
|
200
|
+
// ...
|
|
201
|
+
shareTypes: [ShareType.RecentContacts, ShareType.External],
|
|
202
|
+
})
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## 文档
|
|
206
|
+
|
|
207
|
+
- API 文档站(测试环境):<http://sdk-test.docoi.cc/mys-sdk/docs/>
|
|
208
|
+
- 仓库与 Demo:[mys-sdk monorepo](../../README.md)
|
|
209
|
+
|
|
210
|
+
## License
|
|
211
|
+
|
|
212
|
+
MIT
|