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
- * 仅依赖 WebViewJavascriptBridgeReady 事件,不使用 iframe 注入方式
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设备:监听BridgeReady事件,不再使用iframe触发
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
- // 等待Bridge初始化完成后再执行
180
- _this.waitForReady(300)
181
- .then(function () {
182
- // Bridge已就绪,执行调用
183
- JYClientTHS.bridgeCallHandler(name, params, function (response) {
184
- clearTimeout(timeoutId);
185
- // 只要有响应就 resolve,即使是空对象或只有 login_status
186
- // getUserInfoByRsa 未登录时返回 { login_status: "0" }
187
- if (response !== undefined && response !== null) {
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
- if (this.bridge) {
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,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "crh-jssdk",
3
- "version": "1.0.30",
3
+ "version": "1.0.32",
4
4
  "description": "crh-jssdk",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {