UNPKG

saven

Version:
2,069 lines (1,984 loc) 318 kB
import { buffer } from "rxjs/operators"; export = Saven; export as namespace Saven; declare namespace Saven { interface PageNotFoundObject { /** * 不存在页面的路径 */ path: string, /** * 打开不存在页面的 query */ query: object, /** * 是否本次启动的首个页面(例如从分享等入口进来,首个页面是开发者配置的分享页面) */ isEntryPage: boolean } // Components interface ComponentLifecycle<P, S> { componentWillMount?(): void; componentDidMount?(): void; componentWillReceiveProps?(nextProps: Readonly<P>, nextContext: any): void; shouldComponentUpdate?(nextProps: Readonly<P>, nextState: Readonly<S>, nextContext: any): boolean; componentWillUpdate?(nextProps: Readonly<P>, nextState: Readonly<S>, nextContext: any): void; componentDidUpdate?(prevProps: Readonly<P>, prevState: Readonly<S>, prevContext: any): void; componentWillUnmount?(): void; componentDidShow?(): void; componentDidHide?(): void; componentDidCatchError?(err: string): void; componentDidNotFound?(obj: PageNotFoundObject): void; } interface Component<P = {}, S = {}> extends ComponentLifecycle<P, S> { $scope?: any } interface PageConfig { /** * 导航栏背景颜色,HexColor * default: #000000 */ navigationBarBackgroundColor?: string, /** * 导航栏标题颜色,仅支持 black/white * default: 'white' */ navigationBarTextStyle?: 'white' | 'black', /** * 导航栏标题文字内容 */ navigationBarTitleText?: string, /** * 导航栏样式,仅支持以下值: * default 默认样式 * custom 自定义导航栏 */ navigationStyle?: string, /** * 窗口的背景色, HexColor * default: #ffffff */ backgroundColor?: string, /** * 下拉背景字体、loading 图的样式,仅支持 dark/light * default: 'dark' */ backgroundTextStyle?: 'dark' | 'light', /** * 是否开启下拉刷新 * default: false */ enablePullDownRefresh?: boolean, /** * 页面上拉触底事件触发时距页面底部距离,单位为px * default: 50 */ onReachBottomDistance?: number /** * 设置为 true 则页面整体不能上下滚动;只在页面配置中有效,无法在 app.json 中设置该项 * default: false */ disableScroll?: boolean } interface TarbarList { /** * 页面路径,必须在 pages 中先定义 */ pagePath: string, /** * tab 上按钮文字 */ text: string, /** * 图片路径,icon 大小限制为40kb,建议尺寸为 81px * 81px,当 postion 为 top 时,此参数无效,不支持网络图片 */ iconPath?: string, /** * 选中时的图片路径,icon 大小限制为40kb,建议尺寸为 81px * 81px ,当 postion 为 top 时,此参数无效 */ selectedIconPath?: string, } interface TabBar { /** * tab 上的文字默认颜色 */ color?: string, /** * tab 上的文字选中时的颜色 */ selectedColor?: string, /** * tab 的背景色 */ backgroundColor?: string, /** * tabbar上边框的颜色, 仅支持 black/white * default: black */ borderStyle?: 'black' | 'white', /** * tabar 的位置,可选值 bottom、top * default: 'bottom' */ position?: 'bottom' | 'top', list: TarbarList[] } interface NetworkTimeout { /** * wx.request 的超时时间,单位毫秒。 * @default 60000 */ request?: number /** * wx.connectSocket 的超时时间,单位毫秒。 * @default 60000 */ connectSocket?: number /** * wx.uploadFile 的超时时间,单位毫秒。 * @default 60000 */ uploadFile?: number /** * wx.downloadFile 的超时时间,单位毫秒。 * @default 60000 */ downloadFile?: number } interface SubPackage { /** * 分包根路径 * - 注意:不能放在主包pages目录下 */ root: string, /** * 分包路径下的所有页面配置 */ pages: string[] } interface Plugins { [key: string]: { version: string provider: string } } interface PreloadRule { [key: string]: { /** *进入页面后预下载分包的 root 或 name。__APP__ 表示主包。 */ packages: string[] /** * 在指定网络下预下载,可选值为: * all: 不限网络 * wifi: 仅wifi下预下载 * @default wifi */ network?: 'all' | 'wifi' } } interface AppConfig { /** * 接受一个数组,每一项都是字符串,来指定小程序由哪些页面组成,数组的第一项代表小程序的初始页面 */ pages?: string[], tabBar?: TabBar, /** * 各类网络请求的超时时间,单位均为毫秒。 */ networkTimeout?: NetworkTimeout /** * 是否开启 debug 模式,默认关闭 * @default false */ debug?: boolean /** * 启用插件功能页时,插件所有者小程序需要设置其 functionalPages 为 true。 * @see https://developers.weixin.qq.com/miniprogram/dev/framework/plugin/functional-pages.html * @default false * @since 2.1.0 */ functionalPages?: boolean /** * 分包加载配置 * 示例: * [ * { * root: 'packages/module', * pages: [ * 'pages/page/index' * ] * } * ] * @since 1.7.3 */ subPackages?: SubPackage[] /** * Worker 代码放置的目录 * 使用 Worker 处理多线程任务时,设置 Worker 代码放置的目录 * @since 1.9.9 */ workers?: string /** * 申明需要后台运行的能力,类型为数组。目前支持以下项目: * @since 微信客户端 6.7.2 及以上版本支持 */ requiredBackgroundModes?: ["audio"] /** * 使用到的插件 * @since 1.9.6 */ plugins?: Plugins /** * 声明分包预下载的规则。 * preloadRule 中,key 是页面路径,value 是进入此页面的预下载配置 * 注意: 分包预下载目前只支持通过配置方式使用,暂不支持通过调用API完成。 * vConsole 里有preloadSubpackages开头的日志信息,可以用来验证预下载的情况。 * @since 2.3.0 */ preloadRule?: PreloadRule /** * iPad 小程序是否支持屏幕旋转 * @default false * @since 2.3.0 */ resizable?: boolean } interface Config extends PageConfig, AppConfig { usingComponents?: { [key: string]: string }, window?: PageConfig } interface ComponentOptions { addGlobalClass?: boolean } class Component<P, S> { constructor(props?: P, context?: any); config?: Config; options?: ComponentOptions; $router: { params: any } setState<K extends keyof S>( state: ((prevState: Readonly<S>, props: P) => (Pick<S, K> | S)) | (Pick<S, K> | S), callback?: () => any ): void; forceUpdate(callBack?: () => any): void; render(): any; props: Readonly<P> & Readonly<{ children?: any }>; state: Readonly<S>; context: any; refs: { [key: string]: any }; } class PureComponent<P = {}, S = {}> extends Component<P, S> { } // Events class Events { /** * 监听一个事件,接受参数 */ on(eventName: string | symbol, listener: (...args: any[]) => void): this; /** * 添加一个事件监听,并在事件触发完成之后移除Callbacks链 */ once(eventName: string | symbol, listener: (...args: any[]) => void): this; /** * 取消监听一个事件 */ off(eventName: string | symbol, listener?: (...args: any[]) => void): this; /** * 触发一个事件,传参 */ trigger(eventName: string | symbol, ...args: any[]): boolean; } // eventCenter namespace eventCenter { function on(eventName: string | symbol, listener: (...args: any[]) => void): void; function once(eventName: string | symbol, listener: (...args: any[]) => void): void; function off(eventName: string | symbol, listener?: (...args: any[]) => void): void; function trigger(eventName: string | symbol, ...args: any[]): boolean; } // ENV_TYPE enum ENV_TYPE { WEAPP = 'WEAPP', WEB = 'WEB', RN = 'RN' } function getEnv(): ENV_TYPE.WEAPP | ENV_TYPE.WEB | ENV_TYPE.RN; function render(component: Component | JSX.Element, element: Element | null) function pxTransform(size: number): string /** * 小程序引用插件 JS 接口 */ function requirePlugin(pluginName: string): any /** * * 微信端能力 * original code from: https://github.com/qiu8310/minapp/blob/master/packages/minapp-wx/typing/wx.d.ts * Lincenced under MIT license: https://github.com/qiu8310/minapp/issues/69 * thanks for the great work by @qiu8310 👍👍👍 * */ namespace request { type Promised<T extends any | string | ArrayBuffer = any> = { /** * 开发者服务器返回的数据 * * **data 数据说明:** * * 最终发送给服务器的数据是 String 类型,如果传入的 data 不是 String 类型,会被转换成 String 。转换规则如下: * * * 对于 `GET` 方法的数据,会将数据转换成 query string(encodeURIComponent(k)=encodeURIComponent(v)&encodeURIComponent(k)=encodeURIComponent(v)...) * * 对于 `POST` 方法且 `header['content-type']` 为 `application/json` 的数据,会对数据进行 JSON 序列化 * * 对于 `POST` 方法且 `header['content-type']` 为 `application/x-www-form-urlencoded` 的数据,会将数据转换成 query string (encodeURIComponent(k)=encodeURIComponent(v)&encodeURIComponent(k)=encodeURIComponent(v)...) */ data: T /** * 开发者服务器返回的 HTTP 状态码 */ statusCode: number /** * 开发者服务器返回的 HTTP Response Header * * @since 1.2.0 */ header: any } type Param<P extends any | string | ArrayBuffer = any> = { /** * 开发者服务器接口地址 */ url: string /** * 请求的参数 */ data?: P /** * 设置请求的 header,header 中不能设置 Referer。 */ header?: any /** * (需大写)有效值:OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT * * @default GET */ method?: 'OPTIONS' | 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'TRACE' | 'CONNECT' /** * 如果设为json,会尝试对返回的数据做一次 JSON.parse * * @default json */ dataType?: string /** * 设置响应的数据类型。合法值:text、arraybuffer * * @default text * @since 1.7.0 */ responseType?: string, /** * 设置H5端是否使用jsonp方式获取数据 * * @default false */ jsonp?: boolean, /** * 设置H5端 jsonp 请求 url 是否需要被缓存 * * @default false */ jsonpCache?: boolean, /** * 设置H5端是否允许跨域请求。有效值:no-cors, cors, same-origin * * @default same-origin */ mode?: 'no-cors' | 'cors' | 'same-origin', /** * 设置H5端是否携带 Cookie。有效值:include, same-origin, omit * * @default omit */ credentials?: 'include' | 'same-origin' | 'omit', /** * 设置H5端缓存模式。有效值:default, no-cache, reload, force-cache, only-if-cached * * @default default */ cache?: 'default' | 'no-cache' | 'reload' | 'force-cache' | 'only-if-cached' } } /** * 发起网络请求。**使用前请先阅读[说明](https://developers.weixin.qq.com/miniprogram/dev/api/api-network.html)**。 * * **返回值:** * * @since 1.4.0 * * 返回一个 `requestTask` 对象,通过 `requestTask`,可中断请求任务。 * * **Bug & Tip:** * * 1. `tip`: content-type 默认为 'application/json'; * 2. `tip`: url 中不能有端口; * 3. `bug`: 开发者工具 `0.10.102800` 版本,`header` 的 `content-type` 设置异常; * * **示例代码:** * * ```javascript * Saven.request({ * url: 'test.php', //仅为示例,并非真实的接口地址 * data: { * x: '' , * y: '' * }, * header: { * 'content-type': 'application/json' // 默认值 * }, * success: function(res) { * console.log(res.data) * } * }) * ``` * * **示例代码:** * * ```javascript * const requestTask = Saven.request({ * url: 'test.php', //仅为示例,并非真实的接口地址 * data: { * x: '' , * y: '' * }, * header: { * 'content-type': 'application/json' * }, * success: function(res) { * console.log(res.data) * } * }) * * requestTask.abort() // 取消请求任务 * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/network-request.html#wxrequestobject */ function request<T = any, U = any>(OBJECT: request.Param<U>): Promise<request.Promised<T>> type arrayBuffer = Uint8Array | Int8Array | Uint8Array | Uint8ClampedArray | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array | ArrayBuffer /** * 将 ArrayBuffer 数据转成 Base64 字符串 */ function arrayBufferToBase64(buffer: arrayBuffer): string /** * 将 Base64 字符串转成 ArrayBuffer 数据 */ function base64ToArrayBuffer(base64: string): arrayBuffer namespace uploadFile { type Promised = { /** * 开发者服务器返回的数据 */ data: string /** * 开发者服务器返回的 HTTP 状态码 */ statusCode: number } type Param = { /** * 开发者服务器 url */ url: string /** * 要上传文件资源的路径 */ filePath: string /** * 文件对应的 key , 开发者在服务器端通过这个 key 可以获取到文件二进制内容 */ name: string /** * HTTP 请求 Header, header 中不能设置 Referer */ header?: any /** * HTTP 请求中其他额外的 form data */ formData?: any } } /** * 将本地资源上传到开发者服务器,客户端发起一个 HTTPS POST 请求,其中 `content-type` 为 `multipart/form-data` 。**使用前请先阅读[说明](https://developers.weixin.qq.com/miniprogram/dev/api/api-network.html)**。 * * 如页面通过 [Saven.chooseImage](https://developers.weixin.qq.com/miniprogram/dev/api/media-picture.html#wxchooseimageobject) 等接口获取到一个本地资源的临时文件路径后,可通过此接口将本地资源上传到指定服务器。 * * **返回值:** * * @since 1.4.0 * * 返回一个 `uploadTask` 对象,通过 `uploadTask`,可监听上传进度变化事件,以及取消上传任务。 * * **示例代码:** * * ```javascript * Saven.chooseImage({ * success: function(res) { * var tempFilePaths = res.tempFilePaths * Saven.uploadFile({ * url: 'https://example.weixin.qq.com/upload', //仅为示例,非真实的接口地址 * filePath: tempFilePaths[0], * name: 'file', * formData:{ * 'user': 'test' * }, * success: function(res){ * var data = res.data * //do something * } * }) * } * }) * ``` * * **示例代码:** * * ```javascript * const uploadTask = Saven.uploadFile({ * url: 'http://example.weixin.qq.com/upload', //仅为示例,非真实的接口地址 * filePath: tempFilePaths[0], * name: 'file', * formData:{ * 'user': 'test' * }, * success: function(res){ * var data = res.data * //do something * } * }) * * uploadTask.onProgressUpdate((res) => { * console.log('上传进度', res.progress) * console.log('已经上传的数据长度', res.totalBytesSent) * console.log('预期需要上传的数据总长度', res.totalBytesExpectedToSend) * }) * * uploadTask.abort() // 取消上传任务 * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/network-file.html#wxuploadfileobject */ function uploadFile(OBJECT: uploadFile.Param): Promise<uploadFile.Promised> namespace downloadFile { type Promised = { /** * 临时文件路径,下载后的文件会存储到一个临时文件 */ tempFilePath: string /** * 开发者服务器返回的 HTTP 状态码 */ statusCode: number } type Param = { /** * 下载资源的 url */ url: string /** * HTTP 请求 Header,header 中不能设置 Referer */ header?: any } } /** * 下载文件资源到本地,客户端直接发起一个 HTTP GET 请求,返回文件的本地临时路径。**使用前请先阅读[说明](https://developers.weixin.qq.com/miniprogram/dev/api/api-network.html)**。 * * **返回值:** * * @since 1.4.0 * * 返回一个 `downloadTask` 对象,通过 `downloadTask`,可监听下载进度变化事件,以及取消下载任务。 * * **Bug & Tip:** * * 1. `tip`: 6.5.3 以及之前版本的 iOS 微信客户端 `header` 设置无效 * * **示例代码:** * * ```javascript * Saven.downloadFile({ * url: 'https://example.com/audio/123', //仅为示例,并非真实的资源 * success: function(res) { * // 只要服务器有响应数据,就会把响应内容写入文件并进入 success 回调,业务需要自行判断是否下载到了想要的内容 * if (res.statusCode === 200) { * Saven.playVoice({ * filePath: res.tempFilePath * }) * } * } * }) * ``` * * **示例代码:** * * ```javascript * const downloadTask = Saven.downloadFile({ * url: 'http://example.com/audio/123', //仅为示例,并非真实的资源 * success: function(res) { * Saven.playVoice({ * filePath: res.tempFilePath * }) * } * }) * * downloadTask.onProgressUpdate((res) => { * console.log('下载进度', res.progress) * console.log('已经下载的数据长度', res.totalBytesWritten) * console.log('预期需要下载的数据总长度', res.totalBytesExpectedToWrite) * }) * * downloadTask.abort() // 取消下载任务 * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/network-file.html#wxdownloadfileobject */ function downloadFile(OBJECT: downloadFile.Param): Promise<downloadFile.Promised> namespace connectSocket { type Promised = { /** * 返回一个SocketTask */ socketTask: SocketTask } type Param = { /** * 开发者服务器接口地址,必须是 wss 协议,且域名必须是后台配置的合法域名 */ url: string /** * HTTP Header , header 中不能设置 Referer */ header?: any /** * 默认是GET,有效值:OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT */ method?: 'OPTIONS' | 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'TRACE' | 'CONNECT' /** * 子协议数组 * * @since 1.4.0 */ protocols?: string[] } } /** * 创建一个 [WebSocket](https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket) 连接。**使用前请先阅读[说明](https://developers.weixin.qq.com/miniprogram/dev/api/api-network.html)**。 * * **基础库 1.7.0 之前,一个微信小程序同时只能有一个 WebSocket 连接,如果当前已存在一个 WebSocket 连接,会自动关闭该连接,并重新创建一个 WebSocket 连接。基础库版本 1.7.0 及以后,支持存在多个 WebSokcet 连接,每次成功调用 Saven.connectSocket 会返回一个新的 [SocketTask](https://developers.weixin.qq.com/miniprogram/dev/api/socket-task.html)。** * * **示例代码:** * * ```javascript * Saven.connectSocket({ * url: 'wss://example.qq.com', * data:{ * x: '', * y: '' * }, * header:{ * 'content-type': 'application/json' * }, * protocols: ['protocol1'], * method:"GET" * }) * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/network-socket.html#wxconnectsocketobject */ function connectSocket(OBJECT: connectSocket.Param): Promise<connectSocket.Promised> namespace onSocketOpen { type Param = (res: ParamParam) => any type ParamParam = { /** * 连接成功的 HTTP 响应 Header * * @since 2.0.0 */ header?: any } } /** * 监听WebSocket连接打开事件。 * * **示例代码:** * * ```javascript * Saven.connectSocket({ * url: 'test.php' * }) * Saven.onSocketOpen(function(res) { * console.log('WebSocket连接已打开!') * }) * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/network-socket.html#wxonsocketopencallback */ function onSocketOpen(callback?: onSocketOpen.Param): void /** * 监听WebSocket错误。 * * **示例代码:** * * ```javascript * Saven.connectSocket({ * url: 'test.php' * }) * Saven.onSocketOpen(function(res){ * console.log('WebSocket连接已打开!') * }) * Saven.onSocketError(function(res){ * console.log('WebSocket连接打开失败,请检查!') * }) * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/network-socket.html#wxonsocketerrorcallback */ function onSocketError(CALLBACK: any): void namespace sendSocketMessage { type Param = { /** * 需要发送的内容 */ data: string | ArrayBuffer } } /** * 通过 WebSocket 连接发送数据,需要先 [Saven.connectSocket](https://developers.weixin.qq.com/miniprogram/dev/api/network-socket.html#wxconnectsocketobject),并在 [Saven.onSocketOpen](https://developers.weixin.qq.com/miniprogram/dev/api/network-socket.html#wxonsocketopencallback) 回调之后才能发送。 * * **示例代码:** * * ```javascript * var socketOpen = false * var socketMsgQueue = [] * Saven.connectSocket({ * url: 'test.php' * }) * * Saven.onSocketOpen(function(res) { * socketOpen = true * for (var i = 0; i < socketMsgQueue.length; i++){ * sendSocketMessage(socketMsgQueue[i]) * } * socketMsgQueue = [] * }) * * function sendSocketMessage(msg) { * if (socketOpen) { * Saven.sendSocketMessage({ * data:msg * }) * } else { * socketMsgQueue.push(msg) * } * } * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/network-socket.html#wxsendsocketmessageobject */ function sendSocketMessage(OBJECT: sendSocketMessage.Param): Promise<any> namespace onSocketMessage { type Param<T = any> = (res: ParamParam<T>) => any type ParamParam<T extends any | string | ArrayBuffer = any> = { /** * 服务器返回的消息 */ data: T } } /** * 监听WebSocket接受到服务器的消息事件。 * * **示例代码:** * * ```javascript * Saven.connectSocket({ * url: 'test.php' * }) * * Saven.onSocketMessage(function(res) { * console.log('收到服务器内容:' + res.data) * }) * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/network-socket.html#wxonsocketmessagecallback */ function onSocketMessage<T = any>(CALLBACK?: onSocketMessage.Param<T>): void namespace closeSocket { type Param = { /** * 一个数字值表示关闭连接的状态号,表示连接被关闭的原因。如果这个参数没有被指定,默认的取值是1000 (表示正常连接关闭) * * @since 1.4.0 */ code?: number /** * 一个可读的字符串,表示连接被关闭的原因。这个字符串必须是不长于123字节的UTF-8 文本(不是字符) * * @since 1.4.0 */ reason?: string } } /** * 关闭 WebSocket 连接。 * @see https://developers.weixin.qq.com/miniprogram/dev/api/network-socket.html#wxclosesocketobject */ function closeSocket(OBJECT?: closeSocket.Param): Promise<any> /** * 监听WebSocket关闭。 * * **返回值:** * * @since 1.7.0 * * 返回一个 [SocketTask](https://developers.weixin.qq.com/miniprogram/dev/api/socket-task.html)。 * * **Bug & Tip:** * * 1. `tip`: 基础库 1.7.0 开始,支持同时存在 2 条 WebSocket 连接 * * **示例:** * * ```javascript * Saven.connectSocket({ * url: 'test.php' * }) * * //注意这里有时序问题, * //如果 Saven.connectSocket 还没回调 Saven.onSocketOpen,而先调用 Saven.closeSocket,那么就做不到关闭 WebSocket 的目的。 * //必须在 WebSocket 打开期间调用 Saven.closeSocket 才能关闭。 * Saven.onSocketOpen(function() { * Saven.closeSocket() * }) * * Saven.onSocketClose(function(res) { * console.log('WebSocket 已关闭!') * }) * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/network-socket.html#wxonsocketclosecallback */ function onSocketClose(CALLBACK?: (res: any) => any): void namespace SocketTask { namespace send { type Param = { /** * 需要发送的内容 */ data: string | ArrayBuffer /** * 接口调用成功的回调函数 */ success?: ParamPropSuccess /** * 接口调用失败的回调函数 */ fail?: ParamPropFail /** * 接口调用结束的回调函数(调用成功、失败都会执行) */ complete?: ParamPropComplete } /** * 接口调用成功的回调函数 */ type ParamPropSuccess = (res: any) => any /** * 接口调用失败的回调函数 */ type ParamPropFail = (err: any) => any /** * 接口调用结束的回调函数(调用成功、失败都会执行) */ type ParamPropComplete = () => any } namespace close { type Param = { /** * 一个数字值表示关闭连接的状态号,表示连接被关闭的原因。如果这个参数没有被指定,默认的取值是1000 (表示正常连接关闭) */ code?: number /** * 一个可读的字符串,表示连接被关闭的原因。这个字符串必须是不长于123字节的UTF-8 文本(不是字符) */ reason?: string /** * 接口调用成功的回调函数 */ success?: ParamPropSuccess /** * 接口调用失败的回调函数 */ fail?: ParamPropFail /** * 接口调用结束的回调函数(调用成功、失败都会执行) */ complete?: ParamPropComplete } /** * 接口调用成功的回调函数 */ type ParamPropSuccess = (res: any) => any /** * 接口调用失败的回调函数 */ type ParamPropFail = (err: any) => any /** * 接口调用结束的回调函数(调用成功、失败都会执行) */ type ParamPropComplete = () => any } namespace onError { type Param = (res: ParamParam) => any type ParamParam = { /** * 错误信息 */ errMsg: string } } namespace onMessage { type Param<T = any> = (res: ParamParam<T>) => any type ParamParam<T extends any | string | ArrayBuffer = any> = { /** * 服务器返回的消息 */ data: T } } } /** * @since 1.7.0 * * WebSocket 任务,可通过 [Saven.connectSocket()](https://developers.weixin.qq.com/miniprogram/dev/api/network-socket.html) 接口创建返回。 */ class SocketTask { /** * websocket 当前的连接状态。 */ readonly readyState: boolean; /** * websocket 状态值:连接中。 */ readonly CONNECTING: boolean; /** * websocket 状态值:已连接。 */ readonly OPEN: boolean; /** * websocket 状态值:关闭中。 */ readonly CLOSING: boolean; /** * websocket 状态值:已关闭。 */ readonly CLOSED: boolean; /** * 浏览器 websocket 实例。(h5 端独有) */ readonly ws: WebSocket; /** * * **SocketTask.send(OBJECT):** * * 通过 WebSocket 连接发送数据。 */ send(OBJECT: SocketTask.send.Param): void /** * * **SocketTask.close(OBJECT):** * * 关闭 WebSocket 连接。 */ close(OBJECT: SocketTask.close.Param): void /** * * **SocketTask.onOpen(CALLBACK):** * * 监听 WebSocket 连接打开事件。 */ onOpen(CALLBACK?: any): void /** * * **SocketTask.onClose(CALLBACK):** * * 监听 WebSocket 连接关闭事件。 */ onClose(CALLBACK?: any): void /** * * **SocketTask.onError(CALLBACK):** * * 监听 WebSocket 错误。 */ onError(CALLBACK?: SocketTask.onError.Param): void /** * * **SocketTask.onMessage(CALLBACK):** * * 监听WebSocket接受到服务器的消息事件。 */ onMessage<T = any>(CALLBACK: SocketTask.onMessage.Param<T>): void } namespace chooseImage { type Promised = { /** * 图片的本地文件路径列表 */ tempFilePaths: string[] /** * 图片的本地文件列表,每一项是一个 File 对象 * * @since 1.2.0 */ tempFiles: PromisedPropTempFiles } /** * 图片的本地文件列表,每一项是一个 File 对象 */ type PromisedPropTempFiles = PromisedPropTempFilesItem[] type PromisedPropTempFilesItem = { /** * 本地文件路径 */ path: string /** * 本地文件大小,单位:B */ size: number } type Param = { /** * 最多可以选择的图片张数,默认9 */ count?: number /** * original 原图,compressed 压缩图,默认二者都有 */ sizeType?: string[] /** * album 从相册选图,camera 使用相机,默认二者都有 */ sourceType?: string[] } } /** * 从本地相册选择图片或使用相机拍照。 * * **示例代码:** * * ```javascript * Saven.chooseImage({ * count: 1, // 默认9 * sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有 * sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有 * success: function (res) { * // 返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片 * var tempFilePaths = res.tempFilePaths * } * }) * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/media-picture.html#wxchooseimageobject */ function chooseImage(OBJECT?: chooseImage.Param): Promise<chooseImage.Promised> namespace previewImage { type Param = { /** * 当前显示图片的链接,不填则默认为 urls 的第一张 */ current?: string /** * 需要预览的图片链接列表 */ urls: string[] } } /** * 预览图片。 * * **示例代码:** * * ```javascript * Saven.previewImage({ * current: '', // 当前显示图片的http链接 * urls: [] // 需要预览的图片http链接列表 * }) * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/media-picture.html#wxpreviewimageobject */ function previewImage(OBJECT: previewImage.Param): Promise<any> namespace getImageInfo { type Promised = { /** * 图片宽度,单位px */ width: number /** * 图片高度,单位px */ height: number /** * 返回图片的本地路径 */ path: string /** * 返回图片的方向,有效值见下表 * * **orientation参数说明:** * * 枚举值 | 说明 * -------------------|----------------- * up | 默认 * down | 180度旋转 * left | 逆时针旋转90度 * right | 顺时针旋转90度 * up-mirrored | 同up,但水平翻转 * down-mirrored | 同down,但水平翻转 * left-mirrored | 同left,但垂直翻转 * right-mirrored | 同right,但垂直翻转 * * @since 1.9.90 */ orientation: 'up' | 'down' | 'left' | 'right' | 'up-mirrored' | 'down-mirrored ' | 'left-mirrored' | 'right-mirrored' /** * 返回图片的格式 * * @since 1.9.90 */ type: string } type Param = { /** * 图片的路径,可以是相对路径,临时文件路径,存储文件路径,网络图片路径 */ src: string } } /** * 获取图片信息 * * **示例代码:** * * ```javascript * Saven.getImageInfo({ * src: 'images/a.jpg', * success: function (res) { * console.log(res.width) * console.log(res.height) * } * }) * * Saven.chooseImage({ * success: function (res) { * Saven.getImageInfo({ * src: res.tempFilePaths[0], * success: function (res) { * console.log(res.width) * console.log(res.height) * } * }) * } * }) * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/media-picture.html#wxgetimageinfoobject */ function getImageInfo(OBJECT: getImageInfo.Param): Promise<getImageInfo.Promised> namespace saveImageToPhotosAlbum { type Promised = { /** * 调用结果 */ errMsg: string } type Param = { /** * 图片文件路径,可以是临时文件路径也可以是永久文件路径,不支持网络图片路径 */ filePath: string } } /** * @since 1.2.0 * * 保存图片到系统相册。需要[用户授权](https://developers.weixin.qq.com/miniprogram/dev/api/authorize-index.html) scope.writePhotosAlbum * * **示例代码:** * * ```javascript * Saven.saveImageToPhotosAlbum({ * success(res) { * } * }) * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/media-picture.html#wxsaveimagetophotosalbumobject */ function saveImageToPhotosAlbum(OBJECT: saveImageToPhotosAlbum.Param): Promise<saveImageToPhotosAlbum.Promised> namespace startRecord { type Promised = { /** * 录音文件的临时路径 */ tempFilePath: string } type Param = {} } /** * **注意:1.6.0 版本开始,本接口不再维护。建议使用能力更强的 [Saven.getRecorderManager](https://developers.weixin.qq.com/miniprogram/dev/api/getRecorderManager.html) 接口** * * 开始录音。当主动调用`Saven.stopRecord`,或者录音超过1分钟时自动结束录音,返回录音文件的临时文件路径。当用户离开小程序时,此接口无法调用。 * * 需要[用户授权](https://developers.weixin.qq.com/miniprogram/dev/api/authorize-index.html) scope.record * @see https://developers.weixin.qq.com/miniprogram/dev/api/media-record.html#wxstartrecordobject */ function startRecord(OBJECT?: startRecord.Param): Promise<startRecord.Promised> /** * ​主动调用停止录音。 * * **示例代码:** * * ```javascript * Saven.startRecord({ * success: function(res) { * var tempFilePath = res.tempFilePath * }, * fail: function(res) { * //录音失败 * } * }) * setTimeout(function() { * //结束录音 * Saven.stopRecord() * }, 10000) * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/media-record.html#wxstoprecord */ function stopRecord(): void /** * @since 1.6.0 * * 获取**全局唯一**的录音管理器 `recorderManager`。 * * **其中,采样率和码率有一定要求,具体有效值如下::** * * 采样率 | 编码码率 * ----------|------------------- * 8000 | 16000 ~ 48000 * 11025 | 16000 ~ 48000 * 12000 | 24000 ~ 64000 * 16000 | 24000 ~ 96000 * 22050 | 32000 ~ 128000 * 24000 | 32000 ~ 128000 * 32000 | 48000 ~ 192000 * 44100 | 64000 ~ 320000 * 48000 | 64000 ~ 320000 * * **示例代码:** * * ```javascript * const recorderManager = Saven.getRecorderManager() * * recorderManager.onStart(() => { * console.log('recorder start') * }) * recorderManager.onPause(() => { * console.log('recorder pause') * }) * recorderManager.onStop((res) => { * console.log('recorder stop', res) * const { tempFilePath } = res * }) * recorderManager.onFrameRecorded((res) => { * const { frameBuffer } = res * console.log('frameBuffer.byteLength', frameBuffer.byteLength) * }) * * const options = { * duration: 10000, * sampleRate: 44100, * numberOfChannels: 1, * encodeBitRate: 192000, * format: 'aac', * frameSize: 50 * } * * recorderManager.start(options) * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/getRecorderManager.html#wxgetrecordermanager */ function getRecorderManager(): RecorderManager namespace RecorderManager { namespace start { type Param = { /** * 指定录音的时长,单位 ms ,如果传入了合法的 duration ,在到达指定的 duration 后会自动停止录音,最大值 600000(10 分钟),默认值 60000(1 分钟) */ duration?: number /** * 采样率,有效值 8000/16000/44100 */ sampleRate?: number /** * 录音通道数,有效值 1/2 */ numberOfChannels?: number /** * 编码码率,有效值见下表格 */ encodeBitRate?: number /** * 音频格式,有效值 aac/mp3 */ format?: string /** * 指定帧大小,单位 KB。传入 frameSize 后,每录制指定帧大小的内容后,会回调录制的文件内容,不指定则不会回调。暂仅支持 mp3 格式。 */ frameSize?: number } } namespace onStop { type Param = (res: ParamParam) => any type ParamParam = { /** * 录音文件的临时路径 */ tempFilePath: string } } namespace onFrameRecorded { type Param = (res: ParamParam) => any type ParamParam = { /** * 录音分片结果数据 */ frameBuffer: ArrayBuffer /** * 当前帧是否正常录音结束前的最后一帧 */ isLastFrame: boolean } } namespace onError { type Param = (res: ParamParam) => any type ParamParam = { /** * 错误信息 */ errMsg: string } } } class RecorderManager { /** * 开始录音 */ start(options: RecorderManager.start.Param): void /** * 暂停录音 */ pause(): void /** * 继续录音 */ resume(): void /** * 停止录音 */ stop(): void /** * 录音开始事件 */ onStart(callback?: () => void): void /** * 录音暂停事件 */ onPause(callback?: () => void): void /** * 录音停止事件,会回调文件地址 */ onStop(callback?: RecorderManager.onStop.Param): void /** * 已录制完指定帧大小的文件,会回调录音分片结果数据。如果设置了 frameSize ,则会回调此事件 */ onFrameRecorded(callback?: RecorderManager.onFrameRecorded.Param): void /** * 录音错误事件, 会回调错误信息 */ onError(callback?: RecorderManager.onError.Param): void } namespace playVoice { type Param = { /** * 需要播放的语音文件的文件路径 */ filePath: string /** * 指定录音时长,到达指定的录音时长后会自动停止录音,单位:秒,默认值:60 * * @since 1.6.0 */ duration?: number } } /** * **注意:1.6.0 版本开始,本接口不再维护。建议使用能力更强的 [Saven.createInnerAudioContext](https://developers.weixin.qq.com/miniprogram/dev/api/createInnerAudioContext.html) 接口** * * 开始播放语音,同时只允许一个语音文件正在播放,如果前一个语音文件还没播放完,将中断前一个语音播放。 * * **示例代码:** * * ```javascript * Saven.startRecord({ * success: function(res) { * var tempFilePath = res.tempFilePath * Saven.playVoice({ * filePath: tempFilePath, * complete: function(){ * } * }) * } * }) * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/media-voice.html#wxplayvoiceobject */ function playVoice(OBJECT: playVoice.Param): Promise<any> /** * 暂停正在播放的语音。再次调用Saven.playVoice播放同一个文件时,会从暂停处开始播放。如果想从头开始播放,需要先调用 Saven.stopVoice。 * * **示例代码:** * * ```javascript * Saven.startRecord({ * success: function(res) { * var tempFilePath = res.tempFilePath * Saven.playVoice({ * filePath: tempFilePath * }) * * setTimeout(function() { * //暂停播放 * Saven.pauseVoice() * }, 5000) * } * }) * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/media-voice.html#wxpausevoice */ function pauseVoice(): void /** * 结束播放语音。 * * **示例代码:** * * ```javascript * Saven.startRecord({ * success: function(res) { * var tempFilePath = res.tempFilePath * Saven.playVoice({ * filePath:tempFilePath * }) * * setTimeout(function(){ * Saven.stopVoice() * }, 5000) * } * }) * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/media-voice.html#wxstopvoice */ function stopVoice(): void namespace getBackgroundAudioPlayerState { type Promised = { /** * 选定音频的长度(单位:s),只有在当前有音乐播放时返回 */ duration: number /** * 选定音频的播放位置(单位:s),只有在当前有音乐播放时返回 */ currentPosition: number /** * 播放状态(2:没有音乐在播放,1:播放中,0:暂停中) */ status: 0 | 1 | 2 /** * 音频的下载进度(整数,80 代表 80%),只有在当前有音乐播放时返回 */ downloadPercent: number /** * 歌曲数据链接,只有在当前有音乐播放时返回 */ dataUrl: string } type Param = {} } /** * **注意:1.2.0 版本开始,本接口不再维护。建议使用能力更强的 [Saven.getBackgroundAudioManager](https://developers.weixin.qq.com/miniprogram/dev/api/getBackgroundAudioManager.html) 接口** * * 获取后台音乐播放状态。 * * **示例代码:** * * ```javascript * Saven.getBackgroundAudioPlayerState({ * success: function(res) { * var status = res.status * var dataUrl = res.dataUrl * var currentPosition = res.currentPosition * var duration = res.duration * var downloadPercent = res.downloadPercent * } * }) * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/media-background-audio.html#wxgetbackgroundaudioplayerstateobject */ function getBackgroundAudioPlayerState(OBJECT?: getBackgroundAudioPlayerState.Param): Promise<getBackgroundAudioPlayerState.Promised> namespace playBackgroundAudio { type Param = { /** * 音乐链接,目前支持的格式有 m4a, aac, mp3, wav */ dataUrl: string /** * 音乐标题 */ title?: string /** * 封面URL */ coverImgUrl?: string } } /** * 使用后台播放器播放音乐,对于微信客户端来说,只能同时有一个后台音乐在播放。当用户离开小程序后,音乐将暂停播放;当用户点击“显示在聊天顶部”时,音乐不会暂停播放;当用户在其他小程序占用了音乐播放器,原有小程序内的音乐将停止播放。 * * **OBJECT参数说明:** * * ```javascript * Saven.playBackgroundAudio({ * dataUrl: '', * title: '', * coverImgUrl: '' * }) * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/media-background-audio.html#wxplaybackgroundaudioobject */ function playBackgroundAudio(OBJECT: playBackgroundAudio.Param): Promise<any> /** * 暂停播放音乐。 * * **示例代码** * * **示例:** * * ```javascript * Saven.pauseBackgroundAudio() * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/media-background-audio.html#wxpausebackgroundaudio */ function pauseBackgroundAudio(): void namespace seekBackgroundAudio { type Param = { /** * 音乐位置,单位:秒 */ position: number } } /** * 控制音乐播放进度。 * * **OBJECT参数说明:** * * ```javascript * Saven.seekBackgroundAudio({ * position: 30 * }) * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/media-background-audio.html#wxseekbackgroundaudioobject */ function seekBackgroundAudio(OBJECT: seekBackgroundAudio.Param): Promise<any> /** * 停止播放音乐。 * * **示例代码** * * **示例:** * * ```javascript * Saven.stopBackgroundAudio() * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/media-background-audio.html#wxstopbackgroundaudio */ function stopBackgroundAudio(): void /** * 监听音乐播放。 * @see https://developers.weixin.qq.com/miniprogram/dev/api/media-background-audio.html#wxonbackgroundaudioplaycallback */ function onBackgroundAudioPlay(CALLBACK: any): void /** * 监听音乐暂停。 * @see https://developers.weixin.qq.com/miniprogram/dev/api/media-background-audio.html#wxonbackgroundaudiopausecallback */ function onBackgroundAudioPause(CALLBACK: any): void /** * 监听音乐停止。 * * **bug & tip:** * * 1. `bug`: `iOS` `6.3.30` Saven.seekBackgroundAudio 会有短暂延迟 * @see https://developers.weixin.qq.com/miniprogram/dev/api/media-background-audio.html#wxonbackgroundaudiostopcallback */ function onBackgroundAudioStop(CALLBACK: any): void /** * @since 1.2.0 * * 获取**全局唯一**的背景音频管理器 `backgroundAudioManager`。 * * **errcode 说明:** * * errCode | 说明 * ------------|--------- * 10001 | 系统错误 * 10002 | 网络错误 * 10003 | 文件错误 * 10004 | 格式错误 * -1 | 未知错误 * * **示例代码:** * * ```javascript * const backgroundAudioManager = Saven.getBackgroundAudioManager() * * backgroundAudioManager.title = '此时此刻' * backgroundAudioManager.epname = '此时此刻' * backgroundAudioManager.singer = '许巍' * backgroundAudioManager.coverImgUrl = 'http://y.gtimg.cn/music/photo_new/T002R300x300M000003rsKF44GyaSk.jpg?max_age=2592000' * backgroundAudioManager.src = 'http://ws.stream.qqmusic.qq.com/M500001VfvsJ21xFqb.mp3?guid=ffffffff82def4af4b12b3cd9337d5e7&uin=346897220&vkey=6292F51E1E384E061FF02C31F716658E5C81F5594D561F2E88B854E81CAAB7806D5E4F103E55D33C16F3FAC506D1AB172DE8600B37E43FAD&fromtag=46' // 设置了 src 之后会自动播放 * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/getBackgroundAudioManager.html#wxgetbackgroundaudiomanager */ function getBackgroundAudioManager(): BackgroundAudioManager class BackgroundAudioManager { /** * 当前音频的长度(单位:s),只有在当前有合法的 src 时返回 * * @readonly */ readonly duration: number /** * 当前音频的播放位置(单位:s),只有在当前有合法的 src 时返回 * * @readonly */ readonly currentTime: number /** * 当前是是否暂停或停止状态,true 表示暂停或停止,false 表示正在播放 * * @readonly */ readonly paused: boolean /** * 音频的数据源,默认为空字符串,**当设置了新的 src 时,会自动开始播放** ,目前支持的格式有 m4a, aac, mp3, wav */ src: string /** * 音频开始播放的位置(单位:s) */ startTime: number /** * 音频缓冲的时间点,仅保证当前播放时间点到此时间点内容已缓冲。 * * @readonly */ buffered: number /** * 音频标题,用于做原生音频播放器音频标题。原生音频播放器中的分享功能,分享出去的卡片标题,也将使用该值。 */ title: string /** * 专辑名,原生音频播放器中的分享功能,分享出去的卡片简介,也将使用该值。 */ epname: string /** * 歌手名,原生音频播放器中的分享功能,分享出去的卡片简介,也将使用该值。 */ singer: string /** * 封面图url,用于做原生音频播放器背景图。原生音频播放器中的分享功能,分享出去的卡片配图及背景也将使用该图。 */ coverImgUrl: string /** * 页面链接,原生音频播放器中的分享功能,分享出去的卡片简介,也将使用该值。 */ webUrl: string /** * 音频协议。默认值为 'http',设置 'hls' 可以支持播放 HLS 协议的直播音频 * * @since 1.9.94 */ protocol: string /** * 播放 */ play(): void /** * 暂停 */ pause(): void /** * 停止 */ stop(): void /** * 跳转到指定位置,单位 s */ seek(position: any): void /** * 背景音频进入可以播放状态,但不保证后面可以流畅播放 */ onCanplay(callback?: () => void): void /** * 背景音频播放事件 */ onPlay(callback?: () => void): void /** * 背景音频暂停事件 */ onPause(callback?: () => void): void /** * 背景音频停止事件 */ onStop(callback?: () => void): void /** * 背景音频自然播放结束事件 */ onEnded(callback?: () => void): void /** * 背景音频播放进度更新事件 */ onTimeUpdate(callback?: () => void): void /** * 用户在系统音乐播放面板点击上一曲事件(iOS only) */ onPrev(callback?: () => void): void /** * 用户在系统音乐播放面板点击下一曲事件(iOS only) */ onNext(callback?: () => void): void /** * 背景音频播放错误事件 */ onError(callback?: () => void): void /** * 音频加载中事件,当音频因为数据不足,需要停下来加载时会触发 */ onWaiting(callback?: () => void): void } /** * **注意:1.6.0 版本开始,本接口不再维护。建议使用能力更强的 [Saven.createInnerAudioContext](https://developers.weixin.qq.com/miniprogram/dev/api/createInnerAudioContext.html) 接口** * * 创建并返回 audio 上下文 `audioContext` 对象。在自定义组件下,第二个参数传入组件实例this,以操作组件内 `<audio/>` 组件 * * **audioContext:** * * `audioContext` 通过 audioId 跟一个 `<audio/>` 组件绑定,通过它可以操作对应的 `<audio/>` 组件。 * * **示例代码:** * * ```html * <!-- audio.wxml --> * <audio src="{{src}}" id="myAudio" ></audio> * * <button type="primary" bindtap="audioPlay">播放</button> * <button type="primary" bindtap="audioPause">暂停</button> * <button type="primary" bindtap="audio14">设置当前播放时间为14秒</button> * <button type="primary" bindtap="audioStart">回到开头</button> * ``` * * **示例代码:** * * ```javascript * // audio.js * Page({ * onReady: function (e) { * // 使用 Saven.createAudioContext 获取 audio 上下文 context * this.audioCtx = Saven.createAudioContext('myAudio') * this.audioCtx.setSrc('http://ws.stream.qqmusic.qq.com/M500001VfvsJ21xFqb.mp3?guid=ffffffff82def4af4b12b3cd9337d5e7&uin=346897220&vkey=6292F51E1E384E06DCBDC9AB7C49FD713D632D313AC4858BACB8DDD29067D3C601481D36E62053BF8DFEAF74C0A5CCFADD6471160CAF3E6A&fromtag=46') * this.audioCtx.play() * }, * data: { * src: '' * }, * audioPlay: function () { * this.audioCtx.play() * }, * audioPause: function () { * this.audioCtx.pause() * }, * audio14: function () { * this.audioCtx.seek(14) * }, * audioStart: function () { * this.audioCtx.seek(0) * } * }) * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/api-audio.html#wxcreateaudiocontextaudioid-this */ function createAudioContext(audioId: string, instance?: any): AudioContext class AudioContext { /** * 音频的地址 */ setSrc(src: string): void /** * 播放 */ play(): void /** * 暂停 */ pause(): void /** * 跳转到指定位置,单位 s */ seek(position: number): void } /** * @since 1.6.0 * * 创建并返回内部 audio 上下文 `innerAudioContext` 对象。_本接口是 `Saven.createAudioContext` 升级版。_ * * **errCode 说明:** * * errCode | 说明 * ------------|--------- * 10001 | 系统错误 * 10002 | 网络错误 * 10003 | 文件错误 * 10004 | 格式错误 * -1 | 未知错误 * * **示例代码:** * * ```javascript * const innerAudioContext = Saven.createInnerAudioContext() * innerAudioContext.autoplay = true * innerAudioContext.src = 'http://ws.stream.qqmusic.qq.com/M500001VfvsJ21xFqb.mp3?guid=ffffffff82def4af4b12b3cd9337d5e7&uin=346897220&vkey=6292F51E1E384E061FF02C31F716658E5C81F5594D561F2E88B854E81CAAB7806D5E4F103E55D33C16F3FAC506D1AB172DE8600B37E43FAD&fromtag=46' * innerAudioContext.onPlay(() => { * console.log('开始播放') * }) * innerAudioContext.onError((res) => { * console.log(res.errMsg) * console.log(res.errCode) * }) * ``` * @see https://developers.weixin.qq.com/miniprogram/dev/api/createInnerAudioContext.html#wxcreateinneraudiocontext */ function createInnerAudioContext(): InnerAudioContext class InnerAudioContext { /** * 音频的数据链接,用于直接播放。 */ src: string /** * 开始播放的位置(单位:s),默认 0 */ startTime: number /** * 是否自动开始播放,默认 false */ autoplay: boolean /** * 是否循环播放,默认 false */ loop: boolean /** * 是否遵循系统静音开关,当此参数为 false 时,即使用户打开了静音开关,也能继续发出声音,默认值 true */ obeyMuteSwitch: boolean /** * 当前音频的长度(单位:s),只有在当前有合法的 src 时返回 * * @readonly */ duration: number /** * 当前音频的播放位置(单位:s),只有在当前有合法的 src 时返回,时间不取整,保留小数点后 6 位 * * @readonly */ currentTime: number /** * 当前是是否暂停或停止状态,true 表示暂停或停止,false 表示正在播放 * * @readonly */ paused: boolean /** * 音频缓冲的时间点,仅保证当前播放时间点到此时间点内容已缓冲。 * * @readonly */ buffered: number /** * 音量。范围 0~1。 * * @since 1.9.90 */ volume: number /** * 播放 */ play(): void /** * 暂停 */ pause(): void /** * 停止 */ stop(): void /** * 跳转到指定位置,单位 s */ seek(position: number): void /** * 销毁当前实例 */ destroy(): void /** * 音频进入可以播放状态,但不保证后面可以流畅播放 */ onCanplay(callback?: () => void): void /** * 音频播放事件 */ onPlay(callback?: () => void): void /** * 音频暂停事件 */ onPause(callback?: () => void): void /** * 音频停止事件 */ onStop(callback?: () => void): void /** * 音频自然播放结束事件 */ onEnded(callback?: () => void): void /** * 音频播放进度更新事件