crh-jssdk 1.0.30 → 1.0.32
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.
|
@@ -64,7 +64,6 @@ var actionMap = {
|
|
|
64
64
|
window.MyWebView.onJsOverrideUrlLoading(str);
|
|
65
65
|
}
|
|
66
66
|
else if (window.HarmonyOS && window.HarmonyOS.onJsOverrideUrlLoading) {
|
|
67
|
-
console.log("HarmonyOS.onJsOverrideUrlLoading: ".concat(str));
|
|
68
67
|
window.HarmonyOS.onJsOverrideUrlLoading(str);
|
|
69
68
|
}
|
|
70
69
|
else {
|
|
@@ -283,6 +282,12 @@ exports.default = {
|
|
|
283
282
|
*/
|
|
284
283
|
setCollect: function (params) {
|
|
285
284
|
var _this = this;
|
|
285
|
+
if ((0, utils_1.checkIsHarmonyOS)()) {
|
|
286
|
+
return {
|
|
287
|
+
error_no: "-1",
|
|
288
|
+
error_info: "暂不支持该功能",
|
|
289
|
+
};
|
|
290
|
+
}
|
|
286
291
|
var sdkParams = {
|
|
287
292
|
productNo: params.productNo,
|
|
288
293
|
productCode: params.productCode,
|
|
@@ -351,6 +356,12 @@ exports.default = {
|
|
|
351
356
|
queryCollect: function (params) {
|
|
352
357
|
var _this = this;
|
|
353
358
|
console.log('queryCollect', params);
|
|
359
|
+
if ((0, utils_1.checkIsHarmonyOS)()) {
|
|
360
|
+
return {
|
|
361
|
+
error_no: "-1",
|
|
362
|
+
error_info: "暂不支持该功能",
|
|
363
|
+
};
|
|
364
|
+
}
|
|
354
365
|
var sdkParams = {
|
|
355
366
|
productNo: params.productNo,
|
|
356
367
|
productCode: params.productCode,
|
|
@@ -5,6 +5,42 @@
|
|
|
5
5
|
* 1. WebViewJavascriptBridge - 通用模式(其他券商)
|
|
6
6
|
* 2. ClientTHS - 同花顺ClientTHS SDK模式(金圆统一)
|
|
7
7
|
*/
|
|
8
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
9
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
10
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
11
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
12
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
13
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
14
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
18
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
19
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
20
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
21
|
+
function step(op) {
|
|
22
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
23
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
24
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
25
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
26
|
+
switch (op[0]) {
|
|
27
|
+
case 0: case 1: t = op; break;
|
|
28
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
29
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
30
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
31
|
+
default:
|
|
32
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
33
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
34
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
35
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
36
|
+
if (t[2]) _.ops.pop();
|
|
37
|
+
_.trys.pop(); continue;
|
|
38
|
+
}
|
|
39
|
+
op = body.call(thisArg, _);
|
|
40
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
41
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
42
|
+
}
|
|
43
|
+
};
|
|
8
44
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
45
|
exports.JYClientTHS = exports.jyBridge = exports.globalBridge = exports.Bridge = exports.JYBridge = void 0;
|
|
10
46
|
// 在脚本加载时立即初始化全局标记
|
|
@@ -42,8 +78,7 @@ var JYClientTHS = {
|
|
|
42
78
|
},
|
|
43
79
|
/**
|
|
44
80
|
* 连接WebViewJavascriptBridge
|
|
45
|
-
*
|
|
46
|
-
* 原因:WVJBCallbacks 已在脚本顶层立即初始化,确保 native _callWVJBCallbacks 调用时数组始终存在
|
|
81
|
+
* 支持重新注入机制:从第三方页面返回后,iOS WebView可能需要通过iframe触发bridge重新注入
|
|
47
82
|
*/
|
|
48
83
|
connectWebViewJavascriptBridge: function (callback) {
|
|
49
84
|
// 如果Bridge已存在,直接使用
|
|
@@ -51,13 +86,29 @@ var JYClientTHS = {
|
|
|
51
86
|
callback(window.WebViewJavascriptBridge);
|
|
52
87
|
return;
|
|
53
88
|
}
|
|
54
|
-
// iOS
|
|
89
|
+
// iOS设备:优先尝试通过 iframe 触发 bridge 重新注入
|
|
90
|
+
// 这样可以处理从第三方页面返回后 bridge 失效的问题
|
|
55
91
|
if (!/Android/.test(navigator.userAgent)) {
|
|
92
|
+
console.log('[ClientTHS] iOS设备,尝试通过iframe触发bridge注入');
|
|
93
|
+
this._injectBridgeViaIframe();
|
|
56
94
|
// 监听BridgeReady事件
|
|
95
|
+
document.addEventListener('WebViewJavascriptBridgeReady', function () {
|
|
96
|
+
console.log('[ClientTHS] WebViewJavascriptBridgeReady 事件触发');
|
|
97
|
+
callback(window.WebViewJavascriptBridge);
|
|
98
|
+
}, false);
|
|
99
|
+
// WVJBCallbacks 用于 native 调用 JS 时找到回调函数
|
|
100
|
+
if (window.WVJBCallbacks) {
|
|
101
|
+
window.WVJBCallbacks.push(callback);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
window.WVJBCallbacks = [callback];
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// Android设备:直接监听事件
|
|
57
109
|
document.addEventListener('WebViewJavascriptBridgeReady', function () {
|
|
58
110
|
callback(window.WebViewJavascriptBridge);
|
|
59
111
|
}, false);
|
|
60
|
-
// WVJBCallbacks 已在脚本顶层初始化,此处直接 push 即可
|
|
61
112
|
if (window.WVJBCallbacks) {
|
|
62
113
|
window.WVJBCallbacks.push(callback);
|
|
63
114
|
}
|
|
@@ -66,6 +117,34 @@ var JYClientTHS = {
|
|
|
66
117
|
}
|
|
67
118
|
}
|
|
68
119
|
},
|
|
120
|
+
/**
|
|
121
|
+
* 通过 iframe 触发 iOS WebViewJavaScriptBridge 重新注入
|
|
122
|
+
* 标准 iOS WVJB 注入方式(官方 demo 使用 wvjbscheme://__BRIDGE_LOADED__)
|
|
123
|
+
*/
|
|
124
|
+
_injectBridgeViaIframe: function () {
|
|
125
|
+
try {
|
|
126
|
+
var iframe_1 = document.createElement('iframe');
|
|
127
|
+
iframe_1.style.display = 'none';
|
|
128
|
+
// iOS 原生拦截此 URL 触发 bridge 重新注入(官方标准方式)
|
|
129
|
+
iframe_1.src = 'wvjbscheme://__BRIDGE_LOADED__';
|
|
130
|
+
document.documentElement.appendChild(iframe_1);
|
|
131
|
+
console.log('[ClientTHS] iframe 已创建用于触发 bridge 重新注入');
|
|
132
|
+
// 立即清理 iframe
|
|
133
|
+
setTimeout(function () {
|
|
134
|
+
try {
|
|
135
|
+
if (iframe_1.parentNode) {
|
|
136
|
+
iframe_1.parentNode.removeChild(iframe_1);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch (e) {
|
|
140
|
+
// ignore
|
|
141
|
+
}
|
|
142
|
+
}, 0);
|
|
143
|
+
}
|
|
144
|
+
catch (e) {
|
|
145
|
+
console.error('[ClientTHS] iframe 创建失败:', e);
|
|
146
|
+
}
|
|
147
|
+
},
|
|
69
148
|
/**
|
|
70
149
|
* 调用App方法
|
|
71
150
|
* 与ClientTemplate.js保持一致
|
|
@@ -126,29 +205,19 @@ var JYBridge = /** @class */ (function () {
|
|
|
126
205
|
/**
|
|
127
206
|
* 初始化Bridge连接
|
|
128
207
|
* 使用ClientTHS初始化方式
|
|
129
|
-
* 注意:从第三方页面返回时 WebView 可能被重建,Bridge 尚未注入,需配合 iframe 触发重新注入
|
|
130
208
|
*/
|
|
131
209
|
JYBridge.prototype.init = function () {
|
|
132
210
|
var _this = this;
|
|
133
211
|
return new Promise(function (resolve) {
|
|
134
212
|
// 使用ClientTHS初始化(与ClientTemplate.js一致)
|
|
135
213
|
JYClientTHS.init();
|
|
136
|
-
var checkCount = 0;
|
|
137
|
-
// 最多等待30秒(300次 * 100ms),超时后不再等待
|
|
138
|
-
var maxChecks = 300;
|
|
139
214
|
// 等待WebViewJavascriptBridgeReady事件
|
|
140
215
|
var checkBridge = function () {
|
|
141
|
-
checkCount++;
|
|
142
216
|
if (window.WebViewJavascriptBridge) {
|
|
143
217
|
_this.bridge = window.WebViewJavascriptBridge;
|
|
144
218
|
console.log('JYBridge 初始化完成');
|
|
145
219
|
resolve();
|
|
146
220
|
}
|
|
147
|
-
else if (checkCount >= maxChecks) {
|
|
148
|
-
// 超时,不再等待
|
|
149
|
-
console.warn('JYBridge 初始化超时(30秒),停止等待');
|
|
150
|
-
resolve();
|
|
151
|
-
}
|
|
152
221
|
else {
|
|
153
222
|
setTimeout(checkBridge, 100);
|
|
154
223
|
}
|
|
@@ -163,58 +232,24 @@ var JYBridge = /** @class */ (function () {
|
|
|
163
232
|
* @param params 参数
|
|
164
233
|
*/
|
|
165
234
|
JYBridge.prototype.bridgeCallHandler = function (type, name, params) {
|
|
166
|
-
var _this = this;
|
|
167
235
|
if (type === void 0) { type = ''; }
|
|
168
236
|
if (name === void 0) { name = ''; }
|
|
169
237
|
if (params === void 0) { params = {}; }
|
|
170
238
|
if (type === 'Promise') {
|
|
171
239
|
return new Promise(function (resolve, reject) {
|
|
172
|
-
// 构造超时 reject 函数,避免重复定义
|
|
173
|
-
var timeoutReject = function () {
|
|
174
|
-
reject(new Error("\u8C03\u7528".concat(name, "\u65B9\u6CD5\u8D85\u65F6\uFF0810\u79D2\uFF09\uFF0CBridge\u53EF\u80FD\u4E0D\u53EF\u7528")));
|
|
175
|
-
};
|
|
176
|
-
// 设置10秒超时
|
|
177
|
-
var timeoutId = setTimeout(timeoutReject, 10000);
|
|
178
240
|
try {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
resolve(response);
|
|
189
|
-
}
|
|
190
|
-
else {
|
|
191
|
-
reject(new Error("\u8C03\u7528".concat(name, "\u65B9\u6CD5\u5931\u8D25\u4E86!")));
|
|
192
|
-
}
|
|
193
|
-
});
|
|
194
|
-
})
|
|
195
|
-
.catch(function () {
|
|
196
|
-
// waitForReady 超时,尝试直接连接
|
|
197
|
-
JYClientTHS.connectWebViewJavascriptBridge(function (bridge) {
|
|
198
|
-
if (bridge && typeof bridge.callHandler === 'function') {
|
|
199
|
-
bridge.callHandler(name, params, function (response) {
|
|
200
|
-
clearTimeout(timeoutId);
|
|
201
|
-
if (response !== undefined && response !== null) {
|
|
202
|
-
resolve(response);
|
|
203
|
-
}
|
|
204
|
-
else {
|
|
205
|
-
reject(new Error("\u8C03\u7528".concat(name, "\u65B9\u6CD5\u5931\u8D25\u4E86!")));
|
|
206
|
-
}
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
clearTimeout(timeoutId);
|
|
211
|
-
reject(new Error('Bridge不可用,请从App重新进入页面'));
|
|
212
|
-
}
|
|
213
|
-
});
|
|
241
|
+
JYClientTHS.bridgeCallHandler(name, params, function (response) {
|
|
242
|
+
// 只要有响应就 resolve,即使是空对象或只有 login_status
|
|
243
|
+
// getUserInfoByRsa 未登录时返回 { login_status: "0" }
|
|
244
|
+
if (response !== undefined && response !== null) {
|
|
245
|
+
resolve(response);
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
reject(new Error("\u8C03\u7528".concat(name, "\u65B9\u6CD5\u5931\u8D25\u4E86!")));
|
|
249
|
+
}
|
|
214
250
|
});
|
|
215
251
|
}
|
|
216
252
|
catch (e) {
|
|
217
|
-
clearTimeout(timeoutId);
|
|
218
253
|
reject(e);
|
|
219
254
|
}
|
|
220
255
|
});
|
|
@@ -268,14 +303,73 @@ var JYBridge = /** @class */ (function () {
|
|
|
268
303
|
JYBridge.prototype.isReady = function () {
|
|
269
304
|
return !!this.bridge;
|
|
270
305
|
};
|
|
306
|
+
/**
|
|
307
|
+
* 检查Bridge是否真正可用
|
|
308
|
+
* 原因:从第三方页面返回时,iOS WebView可能重建,导致缓存的bridge引用失效
|
|
309
|
+
* @returns {boolean}
|
|
310
|
+
*/
|
|
311
|
+
JYBridge.prototype.isBridgeAvailable = function () {
|
|
312
|
+
// 检查 window.WebViewJavascriptBridge 是否存在
|
|
313
|
+
if (!window.WebViewJavascriptBridge) {
|
|
314
|
+
console.warn('[JYBridge] Bridge不存在,需要重新连接');
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
// 检查 bridge 对象是否有 callHandler 方法
|
|
318
|
+
var wb = window.WebViewJavascriptBridge;
|
|
319
|
+
if (typeof wb.callHandler !== 'function') {
|
|
320
|
+
console.warn('[JYBridge] Bridge.callHandler方法不存在,可能已失效');
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
return true;
|
|
324
|
+
};
|
|
325
|
+
/**
|
|
326
|
+
* 主动重连Bridge
|
|
327
|
+
* 从第三方页面返回后调用此方法重置Bridge连接状态
|
|
328
|
+
* 使用 iframe 触发 iOS WebViewJavaScriptBridge 重新注入
|
|
329
|
+
* @returns {Promise<void>}
|
|
330
|
+
*/
|
|
331
|
+
JYBridge.prototype.reconnect = function () {
|
|
332
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
333
|
+
return __generator(this, function (_a) {
|
|
334
|
+
switch (_a.label) {
|
|
335
|
+
case 0:
|
|
336
|
+
console.log('[JYBridge] 开始重连Bridge...');
|
|
337
|
+
// 重置状态
|
|
338
|
+
this.bridge = null;
|
|
339
|
+
// 对于 iOS 设备,使用 iframe 触发 bridge 重新注入
|
|
340
|
+
// 这是 iOS WebViewJavaScriptBridge 的标准用法(官方demo使用 wvjbscheme://__BRIDGE_LOADED__)
|
|
341
|
+
if (/iPhone|iPad|iPod/.test(navigator.userAgent)) {
|
|
342
|
+
console.log('[JYBridge] iOS设备,使用iframe触发bridge重新注入');
|
|
343
|
+
JYClientTHS._injectBridgeViaIframe();
|
|
344
|
+
}
|
|
345
|
+
// 重新初始化
|
|
346
|
+
this.initPromise = this.init();
|
|
347
|
+
return [4 /*yield*/, this.initPromise];
|
|
348
|
+
case 1:
|
|
349
|
+
_a.sent();
|
|
350
|
+
console.log('[JYBridge] Bridge重连完成');
|
|
351
|
+
return [2 /*return*/];
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
});
|
|
355
|
+
};
|
|
271
356
|
/**
|
|
272
357
|
* 等待Bridge准备就绪
|
|
273
358
|
*/
|
|
274
359
|
JYBridge.prototype.waitForReady = function (timeout) {
|
|
275
360
|
if (timeout === void 0) { timeout = 300; }
|
|
276
|
-
|
|
361
|
+
// 如果Bridge可用,直接返回
|
|
362
|
+
if (this.bridge && this.isBridgeAvailable()) {
|
|
277
363
|
return Promise.resolve();
|
|
278
364
|
}
|
|
365
|
+
// 如果Bridge不可用,尝试重连
|
|
366
|
+
if (this.bridge && !this.isBridgeAvailable()) {
|
|
367
|
+
console.warn('[JYBridge] Bridge不可用,尝试自动重连...');
|
|
368
|
+
return this.reconnect()
|
|
369
|
+
.then(function () { return Promise.resolve(); })
|
|
370
|
+
.catch(function () { return Promise.reject(new Error('JYBridge重连失败')); });
|
|
371
|
+
}
|
|
372
|
+
// Bridge不存在,执行初始化
|
|
279
373
|
if (this.initPromise) {
|
|
280
374
|
return Promise.race([
|
|
281
375
|
this.initPromise,
|