# jsapi **Repository Path**: buns-li/jsapi ## Basic Information - **Project Name**: jsapi - **Description**: 作为Hybird App的JS端调用API - **Primary Language**: NodeJS - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2018-05-18 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # jsapi #### 项目介绍 作为Hybird App的JS端调用API ## 一、注入规则 1. Android或IOS端注入到JS上下文的全局对象名称 `JSBridge`(可调整) 原生端注入的`JSBridge`只有一个`invoke`方法, 代码模式如下: ```javascript /** * android和ios内部提供的注入到JS全局上下文中的对象方法 * * @param {String} action 操作名称 * @param {String} dataJSONStr 传递的数据(JSON字符串形式,需要执行JSON的反序列化),默认空字符串 * @param {String} callbackid 客户端需要回调操作的会传入此回调函数的唯一标识,默认传入空字符串 */ JSBridge.invoke = function(action,dataJSONStr,callbackid){ /** * do something */ } ``` 2. H5端封装`JSBridge`并提供一个`JSApi`的全局快捷操作对象 3. Native与H5之间的逻辑通信完全的依赖`action规则` 来做交互核心; ## 二、`Action`规则 客户端利用`JSBridge.invoke`传入的`action`操作名称的规则按如下几类分类: 1. 设备操作类型 `action`格式: "`device`.`操作名称`" | action名称 | 传入数据结构 | respData结构 | | :-----------------------------------------------: | :---------------------------- | :----------------------------------------------------------- | | `device.getNetworkType`
获取设备的网络连接信息 | | " `networkType`":`网络类型`
返回值如下:
1. `UNKNOWN`: `未知网络`
2. `NOTREACHABLE`:`无网络`
3. `wifi`: `wifi网络`
4. `2g`: `2g网络`
5. `3g`: `3g网络`
6. `4g`: `4g网络` | | `device.getLocation`
获取地理位置信息 | | `longitude`: `String`  `经度`
`latitude` : `String`  `纬度`
`accuracy` : `Number`  `精度,单位米`
`speed`: `Number`  `速度,单位毫秒`
`country` :  `String`  `国家名`
`countryCode` :  `string`  `国家编号`
`province` : `String`  `省份名`
`city`:  `String`  `城市名`
`cityCode` : `String`  `城市编码`
`adCode` :   `String`  `区域编码`
`streetNumber` : `Object`  `街道门牌信息,结构是:{street, number}`
`pois`:  `Object Array`   `定位点附近的 POI 信息,结构是:{name, address}` | | `device.makePhonecall`
唤起设备呼叫功能 | `number`: `string`:`电话号码` | `无回调函数` | 2. 窗口操作类型 `action`格式: "view.`操作名称`" | action | 传入数据结构 | respData结构 | | :---------------------------------------------: | :----------------------------------------------------------- | ---------------------- | | `view.close`
关闭当前页面 | | `无回调函数` | | `view.fullscreen`
当前页面开启全屏 | | 成功与否: `true|false` | | `view.back`
页面回退 | | `无回调函数` | | `view.forward`
页面前进 | | `无回调函数` | | `view.goto`
跳转页面 | `url`: `跳转的页面路径`
`title`: `目标页面的标题`
`query`: `目标页面的参数字典` | `无回调函数` | | `view.changeTitle`
改变页面标题 | `title`: `页面标题` | `无回调函数` | | `view.showOptionMenu`
显示页面顶部右上角菜单 | | `无回调函数` | | `view.hideOptionMenu`
隐藏页面顶部右上角菜单 | | `无回调函数` | | | | | 3. Native UI操作类型 `action`格式: "ui.`操作名称`" | action | 传入数据结构 | respData结构 | | :----------------------------------: | ------------------------------------------------------------ | -------------------------------------------------------- | | `ui.showToast`
显示短消息提醒 | | `有回调函数,但不返回数据respData` | | `ui.hideToast`
隐藏短消息提醒 | | `无回调函数` | | `ui.alert`
弹出提示框 | `title`:`提示标题`
`msg`:`提示内容` | `无回调函数` | | `ui.confirm`
弹出选择框 | `title`:`提示标题`
`msg`:`提示内容` | `button`: 选择的按钮 `OK`或`CANCEL` | | `ui.prompt`
弹出对话框 | `title`:`提示标题`
`msg`:`提示内容`
`placeholder`: `默认文本` | `text`:`返回的输入框中的数据文本` | | `ui.showLoading`
弹出loading | `content`: `loading的文字内容`
`delay`:`延迟时间` | `无回调函数` | | `ui.hideLoading`
隐藏loading | | `无回调函数` | | `ui.showActionSheet`
弹出系统菜单 | `title`:`菜单标题`
`items`: `菜单按钮的文字数组`
`cancelText`: `取消按钮文案,默认为` `[取消]` | `index`: [`int`]
从`0`开始,点击取消或蒙层时返回 `-1` | | | | | 4. 图像操作类型 (后续完善) `action`格式: "image.`操作名称`" | action | 传入数据结构 | respData结构 | | :------------------------: | ------------ | ------------ | | `image.choose`
选择图像 | | | | | | | 5. 视频操作类型 (后续完善) `action`格式: "video.`操作名称`" | action | 传入数据结构 | respData结构 | | :------------------------: | ------------ | ------------ | | `video.choose`
选择视频 | | | | | | | 6. 音频操作类型 (后续完善) `action`格式: "audio.`操作名称`" | action | 传入数据结构 | respData结构 | | :------------------------: | ------------ | ------------ | | `audio.choose`
选择音频 | | | | | | | 7. 特定应用的逻辑交互操作类型 `action`格式: "app.`应用名称`.`操作名称`" | action | 传入数据结构 | respData结构 | | :---------------------------------------------------------: | ------------------------------------------------------------ | ------------ | | `app.score.notifyUserLotteried`
积分系统中通知用户已中奖 | `userid`:`用户id`
`userName`:`用户名称`
`goodsName`:`中奖商品名称`
`goodsId`:`中奖商品id`
`goodsType`:`中奖商品类型` | | | | | | ## 三、`H5`与`Native`的交互 **提醒注意**:为了保证页面在被拦截下来之后只在党建App里面使用, jsbridge的调用做了一个最外层的 user-agent的 判断, App端的Webview里面需要在user-agent中添加 `jxrs-hybird-app`的关键字字样,jsbridge才开通的了,同时也是为了给jsbridge提供一个类似环境变量的功能,方便本地调试; ### 1. `H5`主动调用`Native` H5端通过封装的`JSApi`,去利用`action规则`的方式实现如下调用: ```javascript JSApi.view.goto() //等同于 JSBridge.invoke("view.goto")的操作方式 JSApi.ui.alert() //等同于 JSBridge.invoke("ui.alert")的操作方式 ``` ### 2. `Native`处理`H5`端回调 针对IOS和Android在拿到`callbackid`之后,要回调H5端的话,需要执行如下操作调用 ```javascript /** * @param callbackid {String} 回调函数的唯一标识 * @param jsonStr {String} 已经json序列化的对象后的字符串 * * jsonStr内对象数据结构: * { * "err":{ * "msg":"错误信息", * "code":"错误代码", * }, * "respData": "准备传递给回调函数的数据对象或数据值" * } */ JSApi.notify(callbackid,jsonStr) ``` ### 3. `Native`主动调用`H5` Native端需要调用的JS代码如下: ```javascript /** * @param actionName {String} 根据Action规则产生的操作名称(此处的大部分应是特定应用的逻辑交互操作类型) * @param dataJSONStr {String} 需要传递的数据对象的JSON字符串 */ JSApi.invoke(actionName,dataJSONStr) ``` ## 四、特殊化 针对不同应用下,如果因为JSApi和JSBridge产生冲突的话,可以选择使用如下: ```js JSApi.alias("新的名称").aliasBridge("新的JS上下文名称")来解决 ```