@kbapp/js-bridge 0.1.0-alpha.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 +88 -0
- package/dist/core/index.d.ts +35 -0
- package/dist/core/index.js +44 -0
- package/dist/core/lib/ds-bridge.d.ts +7 -0
- package/dist/core/lib/ds-bridge.js +128 -0
- package/dist/core/lib/flutter-ds-bridge.d.ts +7 -0
- package/dist/core/lib/flutter-ds-bridge.js +174 -0
- package/dist/core/lib/js-bridge.d.ts +22 -0
- package/dist/core/lib/js-bridge.js +190 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.js +84 -0
- package/package.json +10 -0
- package/tsconfig.json +20 -0
package/README.MD
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# 开吧客户端桥接
|
|
2
|
+
|
|
3
|
+
> 该桥接仅限于开吧 app 内使用
|
|
4
|
+
|
|
5
|
+
## 下载
|
|
6
|
+
|
|
7
|
+
npm:
|
|
8
|
+
|
|
9
|
+
```js
|
|
10
|
+
npm i '@kbapp/js-bridge'
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
yarn:
|
|
14
|
+
|
|
15
|
+
```js
|
|
16
|
+
yarn add '@kbapp/js-bridge'
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
pnpm:
|
|
20
|
+
|
|
21
|
+
```js
|
|
22
|
+
pnpm add '@kbapp/js-bridge'
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 示例
|
|
26
|
+
|
|
27
|
+
```js
|
|
28
|
+
import { saveImageToLocal } from '@kbapp/js-bridge'
|
|
29
|
+
|
|
30
|
+
saveImageToLocal({
|
|
31
|
+
imageUrl: 'https://static.kaiba315.com.cn/kaiba-logo.png',
|
|
32
|
+
})
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Api
|
|
36
|
+
|
|
37
|
+
### saveImageToLocal
|
|
38
|
+
|
|
39
|
+
> 保存图片到本地
|
|
40
|
+
|
|
41
|
+
#### 请求参数
|
|
42
|
+
|
|
43
|
+
| 参数 | 值类型 | 说明 |
|
|
44
|
+
| -------- | ------ | ------------ |
|
|
45
|
+
| imageUrl | string | 图片网络地址 |
|
|
46
|
+
|
|
47
|
+
#### 返回值
|
|
48
|
+
|
|
49
|
+
无
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
### saveVideoToLocal
|
|
54
|
+
|
|
55
|
+
> 保存视频到本地
|
|
56
|
+
|
|
57
|
+
#### 请求参数
|
|
58
|
+
|
|
59
|
+
| 参数 | 值类型 | 说明 |
|
|
60
|
+
| -------- | ------ | ------------ |
|
|
61
|
+
| videoUrl | string | 视频网络地址 |
|
|
62
|
+
|
|
63
|
+
#### 返回值
|
|
64
|
+
|
|
65
|
+
无
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
### invokeMoreShareModal
|
|
70
|
+
|
|
71
|
+
> 唤起分享更多模态框
|
|
72
|
+
|
|
73
|
+
#### 请求参数
|
|
74
|
+
|
|
75
|
+
| 参数 | 值类型 | 说明 |
|
|
76
|
+
| -------- | ------ | ------------------ |
|
|
77
|
+
| title | string | 分享的标题 |
|
|
78
|
+
| content | string | 分享的内容(副标题) |
|
|
79
|
+
| url | string | 分享的网页链接 |
|
|
80
|
+
| imageUrl | string | 分享的图片 |
|
|
81
|
+
|
|
82
|
+
#### 返回值
|
|
83
|
+
|
|
84
|
+
无
|
|
85
|
+
|
|
86
|
+
## 常见问题
|
|
87
|
+
|
|
88
|
+
1. 桥接触发无反应: 请检查当前是否处于开吧 app 内,以及当前网页是否在白名单内
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** 桥接 */
|
|
2
|
+
export declare const $bridge: {
|
|
3
|
+
registerHandler: (name: any, registerCallback: any) => void;
|
|
4
|
+
callHandler: (name: any, params: any, callback: any) => void;
|
|
5
|
+
} | {
|
|
6
|
+
default: undefined;
|
|
7
|
+
/** 桥接 */
|
|
8
|
+
callHandler: (method: any, args: any, cb: any) => any;
|
|
9
|
+
register: (name: any, fun: any, asyn: any) => void;
|
|
10
|
+
registerHandler: (name: any, fun: any) => void;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
*
|
|
14
|
+
* @description 注册事件 提供给native端调用
|
|
15
|
+
*/
|
|
16
|
+
export declare const registerHandler: (name: string, cb: (data: unknown, cb: (data: Record<string, any>) => void) => void) => void;
|
|
17
|
+
/**
|
|
18
|
+
*
|
|
19
|
+
* @description 主动触发 触发native端任务
|
|
20
|
+
*/
|
|
21
|
+
export declare const callHandler: <Result>(data: {
|
|
22
|
+
/** 任务名称 */
|
|
23
|
+
name: string;
|
|
24
|
+
/** 任务参数 */
|
|
25
|
+
params: {
|
|
26
|
+
type: number;
|
|
27
|
+
data?: any;
|
|
28
|
+
};
|
|
29
|
+
/** 表示 任务执行成功.有且当该任务有回调时触发, */
|
|
30
|
+
success?: ((result: Result) => void) | undefined;
|
|
31
|
+
/** 任务执行失败.有且当该任务有回调时触发 */
|
|
32
|
+
fail?: ((result: any) => void) | undefined;
|
|
33
|
+
/** 成功或失败均触发.有且当该任务有回调时触发 */
|
|
34
|
+
complete?: (() => void) | undefined;
|
|
35
|
+
}) => void;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
define(["require", "exports", "./lib/js-bridge", "./lib/ds-bridge", "./lib/flutter-ds-bridge"], function (require, exports, js_bridge_1, ds_bridge_1, flutter_ds_bridge_1) {
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.callHandler = exports.registerHandler = exports.$bridge = void 0;
|
|
5
|
+
/** 桥接 */
|
|
6
|
+
exports.$bridge = (function (user_agent) {
|
|
7
|
+
if (/(kb_dsbridge_android)/i.test(user_agent)) {
|
|
8
|
+
return (0, ds_bridge_1.default)();
|
|
9
|
+
}
|
|
10
|
+
if (/(kb_dsbridge_flutter)/i.test(user_agent)) {
|
|
11
|
+
return (0, flutter_ds_bridge_1.default)();
|
|
12
|
+
}
|
|
13
|
+
return (0, js_bridge_1.default)();
|
|
14
|
+
})(window.navigator.userAgent);
|
|
15
|
+
/**
|
|
16
|
+
*
|
|
17
|
+
* @description 注册事件 提供给native端调用
|
|
18
|
+
*/
|
|
19
|
+
exports.registerHandler = exports.$bridge.registerHandler;
|
|
20
|
+
/**
|
|
21
|
+
*
|
|
22
|
+
* @description 主动触发 触发native端任务
|
|
23
|
+
*/
|
|
24
|
+
var callHandler = function (data) {
|
|
25
|
+
exports.$bridge.callHandler(data.name, data.params, function (res) {
|
|
26
|
+
var _a, _b, _c;
|
|
27
|
+
var result;
|
|
28
|
+
try {
|
|
29
|
+
result = typeof res === 'string' ? JSON.parse(res) : res;
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
result = {};
|
|
33
|
+
}
|
|
34
|
+
if (result.data) {
|
|
35
|
+
(_a = data.success) === null || _a === void 0 ? void 0 : _a.call(data, result);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
(_b = data.fail) === null || _b === void 0 ? void 0 : _b.call(data, result);
|
|
39
|
+
}
|
|
40
|
+
(_c = data.complete) === null || _c === void 0 ? void 0 : _c.call(data);
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
exports.callHandler = callHandler;
|
|
44
|
+
});
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
define(["require", "exports"], function (require, exports) {
|
|
2
|
+
"use strict";
|
|
3
|
+
var _this = this;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
/*
|
|
6
|
+
* @Author: wangalong
|
|
7
|
+
* @LastEditTime: 2022-07-18 17:25:50
|
|
8
|
+
*/
|
|
9
|
+
exports.default = (function () {
|
|
10
|
+
var bridge = {
|
|
11
|
+
default: _this,
|
|
12
|
+
callHandler: function (method, args, cb) {
|
|
13
|
+
var ret = '';
|
|
14
|
+
if (typeof args == 'function') {
|
|
15
|
+
cb = args;
|
|
16
|
+
args = {};
|
|
17
|
+
}
|
|
18
|
+
var arg = { data: args === undefined ? null : args };
|
|
19
|
+
if (typeof cb == 'function') {
|
|
20
|
+
var cbName = 'dscb' + window.dscb++;
|
|
21
|
+
window[cbName] = cb;
|
|
22
|
+
arg['_dscbstub'] = cbName;
|
|
23
|
+
}
|
|
24
|
+
arg = JSON.stringify(arg);
|
|
25
|
+
//if in webview that dsBridge provided, call!
|
|
26
|
+
if (window._dsbridge) {
|
|
27
|
+
ret = _dsbridge.call(method, arg);
|
|
28
|
+
}
|
|
29
|
+
else if (window._dswk ||
|
|
30
|
+
navigator.userAgent.indexOf('_dsbridge') != -1) {
|
|
31
|
+
ret = prompt('_dsbridge=' + method, arg);
|
|
32
|
+
}
|
|
33
|
+
// //TODO 待商榷 可优化
|
|
34
|
+
// this.registerHandler("CommonResult", cb);
|
|
35
|
+
// this.registerHandler("CommonRequest", cb);
|
|
36
|
+
return JSON.parse(ret || '{}').data;
|
|
37
|
+
},
|
|
38
|
+
register: function (name, fun, asyn) {
|
|
39
|
+
var q = asyn ? window._dsaf : window._dsf;
|
|
40
|
+
if (!window._dsInit) {
|
|
41
|
+
window._dsInit = true;
|
|
42
|
+
//notify native that js apis register successfully on next event loop
|
|
43
|
+
setTimeout(function () {
|
|
44
|
+
bridge.callHandler('_dsb.dsinit');
|
|
45
|
+
}, 0);
|
|
46
|
+
}
|
|
47
|
+
if (typeof fun == 'object') {
|
|
48
|
+
q._obs[name] = fun;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
q[name] = fun;
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
registerHandler: function (name, fun) {
|
|
55
|
+
this.register(name, fun, true);
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
!(function () {
|
|
59
|
+
if (window._dsf)
|
|
60
|
+
return;
|
|
61
|
+
var ob = {
|
|
62
|
+
//保存JS同步方法
|
|
63
|
+
_dsf: {
|
|
64
|
+
_obs: {},
|
|
65
|
+
},
|
|
66
|
+
//保存JS异步方法
|
|
67
|
+
_dsaf: {
|
|
68
|
+
_obs: {},
|
|
69
|
+
},
|
|
70
|
+
dscb: 0,
|
|
71
|
+
jsBridge: bridge,
|
|
72
|
+
_handleMessageFromNative: function (info) {
|
|
73
|
+
var arg = JSON.parse(info.data);
|
|
74
|
+
var ret = {
|
|
75
|
+
id: info.callbackId,
|
|
76
|
+
complete: true,
|
|
77
|
+
};
|
|
78
|
+
var f = this._dsf[info.method];
|
|
79
|
+
var af = this._dsaf[info.method];
|
|
80
|
+
var callSyn = function (f, ob) {
|
|
81
|
+
ret.data = f.apply(ob, arg);
|
|
82
|
+
bridge.callHandler('_dsb.returnValue', ret);
|
|
83
|
+
};
|
|
84
|
+
var callAsyn = function (f, ob) {
|
|
85
|
+
arg.push(function (data, complete) {
|
|
86
|
+
ret.data = data;
|
|
87
|
+
ret.complete = complete !== false;
|
|
88
|
+
bridge.callHandler('_dsb.returnValue', ret);
|
|
89
|
+
});
|
|
90
|
+
f.apply(ob, arg);
|
|
91
|
+
};
|
|
92
|
+
if (f) {
|
|
93
|
+
callSyn(f, this._dsf);
|
|
94
|
+
}
|
|
95
|
+
else if (af) {
|
|
96
|
+
callAsyn(af, this._dsaf);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
//with namespace
|
|
100
|
+
var name = info.method.split('.');
|
|
101
|
+
if (name.length < 2)
|
|
102
|
+
return;
|
|
103
|
+
var method = name.pop();
|
|
104
|
+
var namespace = name.join('.');
|
|
105
|
+
var obs = this._dsf._obs;
|
|
106
|
+
var ob = obs[namespace] || {};
|
|
107
|
+
var m = ob[method];
|
|
108
|
+
if (m && typeof m == 'function') {
|
|
109
|
+
callSyn(m, ob);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
obs = this._dsaf._obs;
|
|
113
|
+
ob = obs[namespace] || {};
|
|
114
|
+
m = ob[method];
|
|
115
|
+
if (m && typeof m == 'function') {
|
|
116
|
+
callAsyn(m, ob);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
for (var attr in ob) {
|
|
123
|
+
window[attr] = ob[attr];
|
|
124
|
+
}
|
|
125
|
+
})();
|
|
126
|
+
return bridge;
|
|
127
|
+
});
|
|
128
|
+
});
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
define(["require", "exports"], function (require, exports) {
|
|
2
|
+
"use strict";
|
|
3
|
+
var _this = this;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
/*
|
|
6
|
+
* @Describe:
|
|
7
|
+
* @Author: chenz
|
|
8
|
+
*/
|
|
9
|
+
exports.default = (function () {
|
|
10
|
+
var callHandler = function (method, args, cb) {
|
|
11
|
+
var ret = '';
|
|
12
|
+
if (typeof args == 'function') {
|
|
13
|
+
cb = args;
|
|
14
|
+
args = {};
|
|
15
|
+
}
|
|
16
|
+
var arg = { data: args === undefined ? null : args };
|
|
17
|
+
if (typeof cb == 'function') {
|
|
18
|
+
var cbName = 'dscb' + window.dscb++;
|
|
19
|
+
window[cbName] = cb;
|
|
20
|
+
arg['_dscbstub'] = cbName;
|
|
21
|
+
}
|
|
22
|
+
arg = JSON.stringify(arg);
|
|
23
|
+
//if in webview that dsBridge provided, call!
|
|
24
|
+
if (window.flutter_inappwebview) {
|
|
25
|
+
// ret = _dsbridge.call(method, arg)
|
|
26
|
+
if (window.flutter_inappwebview.callHandler) {
|
|
27
|
+
ret = window.flutter_inappwebview.callHandler('' + method, arg);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else if (window._dswk || navigator.userAgent.indexOf('_dsbridge') != -1) {
|
|
31
|
+
ret = prompt('_flutterDsbridge=' + method, arg);
|
|
32
|
+
}
|
|
33
|
+
// //TODO 待商榷 可优化
|
|
34
|
+
// this.registerHandler("CommonResult", cb);
|
|
35
|
+
// this.registerHandler("CommonRequest", cb);
|
|
36
|
+
/**
|
|
37
|
+
* @description flutter桥接存在部分ret为Promise的情况,导致JSON.parse异常,暂时不清楚callHandler的用意
|
|
38
|
+
*/
|
|
39
|
+
if (ret instanceof Promise) {
|
|
40
|
+
return ret;
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
return JSON.parse(ret || '{}').data;
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
console.error('callHandle异常,JSON.parse错误');
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
/** 桥接准备完成 */
|
|
50
|
+
var flutterDSBridgeIsReady = function () {
|
|
51
|
+
if (window.navigator.userAgent.includes('Android')) {
|
|
52
|
+
return window.flutter_inappwebview && window.flutter_inappwebview._platformReady;
|
|
53
|
+
}
|
|
54
|
+
return true;
|
|
55
|
+
};
|
|
56
|
+
var insertInCache = (function () {
|
|
57
|
+
var cache = [];
|
|
58
|
+
var stophandle = setInterval(function () {
|
|
59
|
+
if (!flutterDSBridgeIsReady()) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
clearInterval(stophandle);
|
|
63
|
+
cache.forEach(function (params) {
|
|
64
|
+
callHandler.apply(window, params);
|
|
65
|
+
});
|
|
66
|
+
cache.length = 0;
|
|
67
|
+
}, 500);
|
|
68
|
+
return function () {
|
|
69
|
+
var params = [];
|
|
70
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
71
|
+
params[_i] = arguments[_i];
|
|
72
|
+
}
|
|
73
|
+
cache.push(params);
|
|
74
|
+
};
|
|
75
|
+
})();
|
|
76
|
+
var bridge = {
|
|
77
|
+
default: _this,
|
|
78
|
+
callHandler: function (method, args, cb) {
|
|
79
|
+
if (flutterDSBridgeIsReady()) {
|
|
80
|
+
return callHandler(method, args, cb);
|
|
81
|
+
}
|
|
82
|
+
return insertInCache(method, args, cb);
|
|
83
|
+
},
|
|
84
|
+
register: function (name, fun, asyn) {
|
|
85
|
+
var q = asyn ? window._dsaf : window._dsf;
|
|
86
|
+
if (!window._dsInit) {
|
|
87
|
+
window._dsInit = true;
|
|
88
|
+
//notify native that js apis register successfully on next event loop
|
|
89
|
+
setTimeout(function () {
|
|
90
|
+
bridge.callHandler('_dsb.dsinit');
|
|
91
|
+
}, 0);
|
|
92
|
+
}
|
|
93
|
+
if (typeof fun == 'object') {
|
|
94
|
+
q._obs[name] = fun;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
q[name] = fun;
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
registerHandler: function (name, fun) {
|
|
101
|
+
this.register(name, fun, true);
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
!(function () {
|
|
105
|
+
if (window._dsf)
|
|
106
|
+
return;
|
|
107
|
+
var ob = {
|
|
108
|
+
//保存JS同步方法
|
|
109
|
+
_dsf: {
|
|
110
|
+
_obs: {},
|
|
111
|
+
},
|
|
112
|
+
//保存JS异步方法
|
|
113
|
+
_dsaf: {
|
|
114
|
+
_obs: {},
|
|
115
|
+
},
|
|
116
|
+
dscb: 0,
|
|
117
|
+
jsBridge: bridge,
|
|
118
|
+
_handleMessageFromNative: function (info) {
|
|
119
|
+
var arg = JSON.parse(info.data);
|
|
120
|
+
var ret = {
|
|
121
|
+
id: info.callbackId,
|
|
122
|
+
complete: true,
|
|
123
|
+
};
|
|
124
|
+
var f = this._dsf[info.method];
|
|
125
|
+
var af = this._dsaf[info.method];
|
|
126
|
+
var callSyn = function (f, ob) {
|
|
127
|
+
ret.data = f.apply(ob, arg);
|
|
128
|
+
bridge.callHandler('_dsb.returnValue', ret);
|
|
129
|
+
};
|
|
130
|
+
var callAsyn = function (f, ob) {
|
|
131
|
+
arg.push(function (data, complete) {
|
|
132
|
+
ret.data = data;
|
|
133
|
+
ret.complete = complete !== false;
|
|
134
|
+
bridge.callHandler('_dsb.returnValue', ret);
|
|
135
|
+
});
|
|
136
|
+
f.apply(ob, arg);
|
|
137
|
+
};
|
|
138
|
+
if (f) {
|
|
139
|
+
callSyn(f, this._dsf);
|
|
140
|
+
}
|
|
141
|
+
else if (af) {
|
|
142
|
+
callAsyn(af, this._dsaf);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
//with namespace
|
|
146
|
+
var name = info.method.split('.');
|
|
147
|
+
if (name.length < 2)
|
|
148
|
+
return;
|
|
149
|
+
var method = name.pop();
|
|
150
|
+
var namespace = name.join('.');
|
|
151
|
+
var obs = this._dsf._obs;
|
|
152
|
+
var ob = obs[namespace] || {};
|
|
153
|
+
var m = ob[method];
|
|
154
|
+
if (m && typeof m == 'function') {
|
|
155
|
+
callSyn(m, ob);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
obs = this._dsaf._obs;
|
|
159
|
+
ob = obs[namespace] || {};
|
|
160
|
+
m = ob[method];
|
|
161
|
+
if (m && typeof m == 'function') {
|
|
162
|
+
callAsyn(m, ob);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
for (var attr in ob) {
|
|
169
|
+
window[attr] = ob[attr];
|
|
170
|
+
}
|
|
171
|
+
})();
|
|
172
|
+
return bridge;
|
|
173
|
+
});
|
|
174
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
declare function _default(): {
|
|
2
|
+
/**
|
|
3
|
+
* Android / IOS 调用JS,需要明确调用的`function名称` .
|
|
4
|
+
*
|
|
5
|
+
*
|
|
6
|
+
* @param name `function name`
|
|
7
|
+
* @param registerCallback 回调的响应事件
|
|
8
|
+
*/
|
|
9
|
+
registerHandler: (name: any, registerCallback: any) => void;
|
|
10
|
+
/**
|
|
11
|
+
* JS 调用 Android / IOS
|
|
12
|
+
*
|
|
13
|
+
* name: 回调名称, android/ios 名称 ,eg: 'getUserInfo'
|
|
14
|
+
* params 请求参数, eg: { 'userId' : 1}
|
|
15
|
+
* callback: response(响应函数)
|
|
16
|
+
*
|
|
17
|
+
* eg: this.$bridge.callHandler('getUserInfo',{'userId':1},function(data){...})
|
|
18
|
+
*
|
|
19
|
+
*/
|
|
20
|
+
callHandler: (name: any, params: any, callback: any) => void;
|
|
21
|
+
};
|
|
22
|
+
export default _default;
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
2
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
3
|
+
if (ar || !(i in from)) {
|
|
4
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
5
|
+
ar[i] = from[i];
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
9
|
+
};
|
|
10
|
+
define(["require", "exports"], function (require, exports) {
|
|
11
|
+
"use strict";
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.default = (function () {
|
|
14
|
+
/**
|
|
15
|
+
* vue-bridge-webview config
|
|
16
|
+
*
|
|
17
|
+
* @type {{bridgeWebViewDelay: number}}
|
|
18
|
+
*/
|
|
19
|
+
var bridgeConfig = {
|
|
20
|
+
bridgeWebViewDelay: 500,
|
|
21
|
+
callHandle: {}, // bridge android / ios
|
|
22
|
+
};
|
|
23
|
+
var cache = [];
|
|
24
|
+
var $bridge = {
|
|
25
|
+
registerHandler: function () {
|
|
26
|
+
cache.push({
|
|
27
|
+
type: 'registerHandler',
|
|
28
|
+
params: __spreadArray([], arguments, true),
|
|
29
|
+
});
|
|
30
|
+
},
|
|
31
|
+
callHandler: function () {
|
|
32
|
+
cache.push({
|
|
33
|
+
type: 'callHandler',
|
|
34
|
+
params: __spreadArray([], arguments, true),
|
|
35
|
+
});
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
/* ios 初始化 */
|
|
39
|
+
function setupWebViewJavascriptBridge(callback) {
|
|
40
|
+
if (window.WebViewJavascriptBridge) {
|
|
41
|
+
return callback(window.WebViewJavascriptBridge);
|
|
42
|
+
}
|
|
43
|
+
if (window.WVJBCallbacks) {
|
|
44
|
+
return window.WVJBCallbacks.push(callback);
|
|
45
|
+
}
|
|
46
|
+
window.WVJBCallbacks = [callback];
|
|
47
|
+
var WVJBIframe = document.createElement('iframe');
|
|
48
|
+
WVJBIframe.style.display = 'none';
|
|
49
|
+
WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
|
|
50
|
+
document.documentElement.appendChild(WVJBIframe);
|
|
51
|
+
setTimeout(function () {
|
|
52
|
+
document.documentElement.removeChild(WVJBIframe);
|
|
53
|
+
}, 0);
|
|
54
|
+
}
|
|
55
|
+
/* 用于创建桥接对象的函数 , android 初始化 */
|
|
56
|
+
function connectWebViewJavascriptBridge(callback) {
|
|
57
|
+
//如果桥接对象已存在,则直接调用callback函数
|
|
58
|
+
if (window.WebViewJavascriptBridge) {
|
|
59
|
+
callback(window.WebViewJavascriptBridge);
|
|
60
|
+
}
|
|
61
|
+
//否则添加一个监听器来执行callback函数
|
|
62
|
+
else {
|
|
63
|
+
document.addEventListener('WebViewJavascriptBridgeReady', function () {
|
|
64
|
+
callback(window.WebViewJavascriptBridge);
|
|
65
|
+
}, false);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/* ios/android */
|
|
69
|
+
if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {
|
|
70
|
+
//ios 新版桥接
|
|
71
|
+
if (/(kbapp)/i.test(navigator.userAgent)) {
|
|
72
|
+
setupWebViewJavascriptBridge(function (bridge) {
|
|
73
|
+
$bridge = bridge;
|
|
74
|
+
initRegister(bridge);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
connectWebViewJavascriptBridge(function (bridge) {
|
|
79
|
+
$bridge = bridge;
|
|
80
|
+
initRegister(bridge);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else if (/(Android)/i.test(navigator.userAgent)) {
|
|
85
|
+
connectWebViewJavascriptBridge(function (bridge) {
|
|
86
|
+
$bridge = bridge;
|
|
87
|
+
initRegister(bridge);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
// IOS中会主动调用该方法,不清楚为什么
|
|
91
|
+
window.setWebViewFlag = function () { };
|
|
92
|
+
function initRegister(bridge) {
|
|
93
|
+
bridge.init &&
|
|
94
|
+
bridge.init(function (message, responseCallback) {
|
|
95
|
+
var data = { 'Javascript Responds': 'Wee!' };
|
|
96
|
+
responseCallback(data);
|
|
97
|
+
});
|
|
98
|
+
bridge.registerHandler('AppPayResult', function (data, responseCallback) {
|
|
99
|
+
var responseData = { 'Javascript Says': 'Right back atcha!' };
|
|
100
|
+
responseCallback(responseData);
|
|
101
|
+
});
|
|
102
|
+
bridge.registerHandler('UploadImageResult', function (data, responseCallback) {
|
|
103
|
+
var responseData = { 'Javascript Says': 'Upload Success!' };
|
|
104
|
+
responseCallback(responseData);
|
|
105
|
+
});
|
|
106
|
+
bridge.registerHandler('RichInputResult', function (data, responseCallback) {
|
|
107
|
+
var responseData = { 'Javascript Says': 'Upload Success!' };
|
|
108
|
+
responseCallback(responseData);
|
|
109
|
+
});
|
|
110
|
+
bridge.registerHandler('CommonResult', function (data, responseCallback) {
|
|
111
|
+
var responseData = {
|
|
112
|
+
'Javascript Says': 'CommonResult Success!',
|
|
113
|
+
};
|
|
114
|
+
responseCallback(responseData);
|
|
115
|
+
});
|
|
116
|
+
bridge.registerHandler('CommonRequest', function (data, responseCallback) {
|
|
117
|
+
var responseData = {
|
|
118
|
+
'Javascript Says': 'CommonRequest Success!',
|
|
119
|
+
};
|
|
120
|
+
responseCallback(responseData);
|
|
121
|
+
});
|
|
122
|
+
cache.forEach(function (_a) {
|
|
123
|
+
var type = _a.type, params = _a.params;
|
|
124
|
+
switch (type) {
|
|
125
|
+
case 'registerHandler':
|
|
126
|
+
bridge.registerHandler.apply(bridge, params);
|
|
127
|
+
break;
|
|
128
|
+
case 'callHandler':
|
|
129
|
+
bridge.callHandler.apply(bridge, params);
|
|
130
|
+
break;
|
|
131
|
+
default:
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
var VueBridgeWebView = {
|
|
137
|
+
/**
|
|
138
|
+
* Android / IOS 调用JS,需要明确调用的`function名称` .
|
|
139
|
+
*
|
|
140
|
+
*
|
|
141
|
+
* @param name `function name`
|
|
142
|
+
* @param registerCallback 回调的响应事件
|
|
143
|
+
*/
|
|
144
|
+
registerHandler: function (name, registerCallback) {
|
|
145
|
+
if ($bridge['registerHandler']) {
|
|
146
|
+
setTimeout(function () {
|
|
147
|
+
$bridge.registerHandler(name, registerCallback);
|
|
148
|
+
}, bridgeConfig.bridgeWebViewDelay);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
console.log("don't built-in WebView invoking ", name, '{registerHandler}');
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
/**
|
|
155
|
+
* JS 调用 Android / IOS
|
|
156
|
+
*
|
|
157
|
+
* name: 回调名称, android/ios 名称 ,eg: 'getUserInfo'
|
|
158
|
+
* params 请求参数, eg: { 'userId' : 1}
|
|
159
|
+
* callback: response(响应函数)
|
|
160
|
+
*
|
|
161
|
+
* eg: this.$bridge.callHandler('getUserInfo',{'userId':1},function(data){...})
|
|
162
|
+
*
|
|
163
|
+
*/
|
|
164
|
+
callHandler: function (name, params, callback) {
|
|
165
|
+
if ($bridge['callHandler']) {
|
|
166
|
+
try {
|
|
167
|
+
$bridge.callHandler(name, params, function (data) {
|
|
168
|
+
if (typeof callback == 'function') {
|
|
169
|
+
/* 解决部分系统加载延迟导致 ios/android 不响应问题 */
|
|
170
|
+
setTimeout(function () {
|
|
171
|
+
callback(data);
|
|
172
|
+
}, bridgeConfig.bridgeWebViewDelay);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
//TODO 待商榷 可优化
|
|
176
|
+
$bridge.registerHandler('CommonResult', callback);
|
|
177
|
+
$bridge.registerHandler('CommonRequest', callback);
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
console.log(error);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
console.log("don't built-in WebView invoking ", name, '{callHandler}');
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
return VueBridgeWebView;
|
|
189
|
+
});
|
|
190
|
+
});
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* @description 唤起更多分享模态框
|
|
4
|
+
*
|
|
5
|
+
*
|
|
6
|
+
* **示例代码**
|
|
7
|
+
```js
|
|
8
|
+
import { invokeMoreShareModal } from '@kbapp/js-bridge';
|
|
9
|
+
|
|
10
|
+
invokeMoreShareModal({
|
|
11
|
+
title: '开吧分享',
|
|
12
|
+
content: '开吧,开汽车上新生活!',
|
|
13
|
+
url: 'http://www.kaiba315.com.cn/',
|
|
14
|
+
imageUrl: 'https://static.kaiba315.com.cn/kaiba-logo.png'
|
|
15
|
+
})
|
|
16
|
+
```
|
|
17
|
+
*
|
|
18
|
+
* @returns {void} 该函数无返回值
|
|
19
|
+
*/
|
|
20
|
+
export declare function invokeMoreShareModal(data: {
|
|
21
|
+
/** 分享出去的h5地址 */
|
|
22
|
+
url: string;
|
|
23
|
+
/** 分享出去的标题 */
|
|
24
|
+
title: string;
|
|
25
|
+
/** 分享出去的正文内容 */
|
|
26
|
+
content: string;
|
|
27
|
+
/** 分享出去的封面图片 */
|
|
28
|
+
imageUrl: string;
|
|
29
|
+
}): void;
|
|
30
|
+
/**
|
|
31
|
+
*
|
|
32
|
+
* @description 保存图片到本地.
|
|
33
|
+
*
|
|
34
|
+
* **示例代码**
|
|
35
|
+
```js
|
|
36
|
+
import { saveImageToLocal } from '@kbapp/js-bridge';
|
|
37
|
+
|
|
38
|
+
saveImageToLocal({
|
|
39
|
+
imageUrl: 'https://static.kaiba315.com.cn/kaiba-logo.png'
|
|
40
|
+
})
|
|
41
|
+
```
|
|
42
|
+
*
|
|
43
|
+
* @returns {void} 无法确认是否正常保存,因此该函数无返回值
|
|
44
|
+
*/
|
|
45
|
+
export declare function saveImageToLocal(data: {
|
|
46
|
+
/** 图片url(仅支持网络地址) */
|
|
47
|
+
imageUrl: string;
|
|
48
|
+
}): void;
|
|
49
|
+
/**
|
|
50
|
+
*
|
|
51
|
+
* @description 保存视频到本地.
|
|
52
|
+
*
|
|
53
|
+
* **示例代码**
|
|
54
|
+
```js
|
|
55
|
+
import { saveVideoToLocal } from '@kbapp/js-bridge';
|
|
56
|
+
|
|
57
|
+
saveVideoToLocal({
|
|
58
|
+
videoUrl: 'https://static.kaiba315.com.cn/c6e16a556489430fb00557a27be64229.mp4'
|
|
59
|
+
})
|
|
60
|
+
```
|
|
61
|
+
*
|
|
62
|
+
* @returns {void} 无法确认是否正常保存,因此该函数无返回值
|
|
63
|
+
*/
|
|
64
|
+
export declare function saveVideoToLocal(data: {
|
|
65
|
+
/** 视频url(仅支持网络地址) */
|
|
66
|
+
videoUrl: string;
|
|
67
|
+
}): void;
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
define(["require", "exports", "./core"], function (require, exports, core_1) {
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.saveVideoToLocal = exports.saveImageToLocal = exports.invokeMoreShareModal = void 0;
|
|
5
|
+
/**
|
|
6
|
+
*
|
|
7
|
+
* @description 唤起更多分享模态框
|
|
8
|
+
*
|
|
9
|
+
*
|
|
10
|
+
* **示例代码**
|
|
11
|
+
```js
|
|
12
|
+
import { invokeMoreShareModal } from '@kbapp/js-bridge';
|
|
13
|
+
|
|
14
|
+
invokeMoreShareModal({
|
|
15
|
+
title: '开吧分享',
|
|
16
|
+
content: '开吧,开汽车上新生活!',
|
|
17
|
+
url: 'http://www.kaiba315.com.cn/',
|
|
18
|
+
imageUrl: 'https://static.kaiba315.com.cn/kaiba-logo.png'
|
|
19
|
+
})
|
|
20
|
+
```
|
|
21
|
+
*
|
|
22
|
+
* @returns {void} 该函数无返回值
|
|
23
|
+
*/
|
|
24
|
+
function invokeMoreShareModal(data) {
|
|
25
|
+
(0, core_1.callHandler)({
|
|
26
|
+
name: 'OpenActRequest',
|
|
27
|
+
params: {
|
|
28
|
+
type: 58,
|
|
29
|
+
data: data,
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
exports.invokeMoreShareModal = invokeMoreShareModal;
|
|
34
|
+
/**
|
|
35
|
+
*
|
|
36
|
+
* @description 保存图片到本地.
|
|
37
|
+
*
|
|
38
|
+
* **示例代码**
|
|
39
|
+
```js
|
|
40
|
+
import { saveImageToLocal } from '@kbapp/js-bridge';
|
|
41
|
+
|
|
42
|
+
saveImageToLocal({
|
|
43
|
+
imageUrl: 'https://static.kaiba315.com.cn/kaiba-logo.png'
|
|
44
|
+
})
|
|
45
|
+
```
|
|
46
|
+
*
|
|
47
|
+
* @returns {void} 无法确认是否正常保存,因此该函数无返回值
|
|
48
|
+
*/
|
|
49
|
+
function saveImageToLocal(data) {
|
|
50
|
+
(0, core_1.callHandler)({
|
|
51
|
+
name: 'OpenActRequest',
|
|
52
|
+
params: {
|
|
53
|
+
type: 62,
|
|
54
|
+
data: data,
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
exports.saveImageToLocal = saveImageToLocal;
|
|
59
|
+
/**
|
|
60
|
+
*
|
|
61
|
+
* @description 保存视频到本地.
|
|
62
|
+
*
|
|
63
|
+
* **示例代码**
|
|
64
|
+
```js
|
|
65
|
+
import { saveVideoToLocal } from '@kbapp/js-bridge';
|
|
66
|
+
|
|
67
|
+
saveVideoToLocal({
|
|
68
|
+
videoUrl: 'https://static.kaiba315.com.cn/c6e16a556489430fb00557a27be64229.mp4'
|
|
69
|
+
})
|
|
70
|
+
```
|
|
71
|
+
*
|
|
72
|
+
* @returns {void} 无法确认是否正常保存,因此该函数无返回值
|
|
73
|
+
*/
|
|
74
|
+
function saveVideoToLocal(data) {
|
|
75
|
+
(0, core_1.callHandler)({
|
|
76
|
+
name: 'OpenActRequest',
|
|
77
|
+
params: {
|
|
78
|
+
type: 63,
|
|
79
|
+
data: data,
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
exports.saveVideoToLocal = saveVideoToLocal;
|
|
84
|
+
});
|
package/package.json
ADDED
package/tsconfig.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES5",
|
|
4
|
+
"module": "es2015",
|
|
5
|
+
"allowJs": true,
|
|
6
|
+
"strict": true,
|
|
7
|
+
"outDir": "./dist",
|
|
8
|
+
"baseUrl": ".",
|
|
9
|
+
"declaration": true,
|
|
10
|
+
"lib": [
|
|
11
|
+
"esnext",
|
|
12
|
+
"dom"
|
|
13
|
+
],
|
|
14
|
+
"sourceMap": false,
|
|
15
|
+
"moduleResolution": "Node"
|
|
16
|
+
},
|
|
17
|
+
"include": [
|
|
18
|
+
"src"
|
|
19
|
+
]
|
|
20
|
+
}
|