qb-pc-sdk 1.0.2 → 1.0.4

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 CHANGED
@@ -1,8 +1,9 @@
1
1
  # qb-pc-sdk
2
2
 
3
3
  趣变广告 SDK 封装器 - PC端广告接入工具
4
+ 目前PC SDK仅支持Windows系统接入,接入Mac会报错,接入时请注意。
4
5
  自动处理多级接口映射与原生渲染逻辑,简化广告接入流程。
5
- 从 1.0.1 起,浏览器环境会自动加载底层依赖 `qb-pc-ad-sdk-origin`(已改名的原始 SDK),常规打包场景开箱即用。
6
+ 从 1.0.1 起,浏览器环境会自动加载底层依赖 `qb-pc-ad-sdk-origin`,常规打包场景开箱即用。
6
7
 
7
8
  ## 安装
8
9
 
@@ -67,6 +68,33 @@ const adSDK = new AdSDKWrapper({
67
68
  > **注意**:`AdSDK` / `AdSDKWrapper` 是同一个类。
68
69
  > 在浏览器打包场景(webpack/Vite 等)无需再单独 `import 'qb-pc-ad-sdk-origin'`,入口已在有 `window` 时自动 `require` 底层 SDK。若在极端沙箱/SSR 场景下未能挂载 `window.GDTAdSDK`,可手动在入口补充 `import 'qb-pc-ad-sdk-origin';` 作为兜底。
69
70
 
71
+ #### Vue2 / Vue3 / React 等模块化环境(推荐方式)
72
+
73
+ 在某些模块化打包环境中(如 Vue2),如果自动加载失败,需要手动引入底层 SDK 并挂载到 `window`:
74
+
75
+ ```javascript
76
+ // main.js 或入口文件
77
+ import 'qb-pc-ad-sdk-origin/dist/qb-pc-ad-sdk.v1.0.0.js';
78
+ import AdSDK from 'qb-pc-sdk';
79
+ import OriginSDK from 'qb-pc-ad-sdk-origin';
80
+
81
+ // 确保 GDTAdSDK 挂载到 window(模块化环境可能需要手动挂载)
82
+ if (typeof window !== 'undefined' && !window.GDTAdSDK) {
83
+ window.GDTAdSDK = OriginSDK.default || OriginSDK.GDTAdSDK || OriginSDK;
84
+ }
85
+
86
+ // 之后在组件中使用
87
+ new AdSDK({
88
+ appId: 'your-app-id',
89
+ placementId: 'your-placement-id',
90
+ container: '#ad-container',
91
+ onAdLoaded: (ad) => console.log('广告加载成功', ad),
92
+ onAdError: (error, message) => console.error('广告加载失败', error, message)
93
+ });
94
+ ```
95
+
96
+ > **提示**:如果遇到 "SDK Load Timeout" 错误,通常是 `window.GDTAdSDK` 未正确挂载,请按照上述方式手动挂载。
97
+
70
98
  ### 浏览器直接引入(不经打包)
71
99
 
72
100
  ```html
package/index.js CHANGED
@@ -6,13 +6,105 @@
6
6
 
7
7
  const isBrowser = typeof window !== 'undefined';
8
8
 
9
+ // 拦截并过滤微信游戏SDK相关的错误日志(在加载底层SDK之前,仅拦截一次)
10
+ if (isBrowser && typeof window !== 'undefined' && window.console && !window.console.error._qbsdkFiltered) {
11
+ const originalError = window.console.error;
12
+ const originalWarn = window.console.warn;
13
+
14
+ // 过滤函数,检查是否应该过滤
15
+ const shouldFilter = function(...args) {
16
+ const errorText = args.join(' ').toLowerCase();
17
+ return (
18
+ errorText.includes('微信') ||
19
+ errorText.includes('wechat') ||
20
+ errorText.includes('weixin') ||
21
+ errorText.includes('wxgame') ||
22
+ errorText.includes('微信游戏') ||
23
+ errorText.includes('微信小游戏') ||
24
+ errorText.includes('wxgamesdkframe') ||
25
+ errorText.includes('localhost.weixin.qq.com') ||
26
+ errorText.includes('wx_game_base') ||
27
+ errorText.includes('getgamesession') ||
28
+ errorText.includes('xmlhttprequest') ||
29
+ errorText.includes('err_failed') ||
30
+ errorText.includes('err_connection_refused') ||
31
+ errorText.includes('cors policy') ||
32
+ errorText.includes('secure context') ||
33
+ errorText.includes('loopback') ||
34
+ errorText.includes('more-private address space')
35
+ );
36
+ };
37
+
38
+ const filteredError = function(...args) {
39
+ // 如果不是微信相关的错误,正常输出
40
+ if (!shouldFilter(...args)) {
41
+ originalError.apply(window.console, args);
42
+ }
43
+ };
44
+
45
+ const filteredWarn = function(...args) {
46
+ // 如果不是微信相关的警告,正常输出
47
+ if (!shouldFilter(...args)) {
48
+ originalWarn.apply(window.console, args);
49
+ }
50
+ };
51
+
52
+ // 标记已过滤,避免重复拦截
53
+ filteredError._qbsdkFiltered = true;
54
+ filteredWarn._qbsdkFiltered = true;
55
+ window.console.error = filteredError;
56
+ window.console.warn = filteredWarn;
57
+
58
+ // 拦截全局错误事件,过滤微信游戏SDK相关的错误
59
+ if (!window._qbsdkErrorHandlerAdded) {
60
+ const originalOnError = window.onerror;
61
+ window.onerror = function(message, source, lineno, colno, error) {
62
+ const errorText = (message || '').toLowerCase() + (source || '').toLowerCase();
63
+ if (shouldFilter(errorText)) {
64
+ // 静默处理,不输出
65
+ return true; // 阻止默认错误处理
66
+ }
67
+ // 其他错误正常处理
68
+ if (originalOnError) {
69
+ return originalOnError.call(this, message, source, lineno, colno, error);
70
+ }
71
+ return false;
72
+ };
73
+
74
+ // 拦截未捕获的 Promise rejection
75
+ const originalUnhandledRejection = window.onunhandledrejection;
76
+ window.addEventListener('unhandledrejection', function(event) {
77
+ const errorText = (event.reason?.message || event.reason || '').toString().toLowerCase();
78
+ if (shouldFilter(errorText)) {
79
+ // 阻止默认行为,静默处理
80
+ event.preventDefault();
81
+ return;
82
+ }
83
+ // 其他错误正常处理
84
+ if (originalUnhandledRejection) {
85
+ originalUnhandledRejection.call(window, event);
86
+ }
87
+ });
88
+
89
+ window._qbsdkErrorHandlerAdded = true;
90
+ }
91
+ }
92
+
9
93
  // 浏览器中预加载底层 SDK(仅 side-effect,挂载 window.GDTAdSDK)
10
94
  if (isBrowser) {
11
95
  try {
12
- require('qb-pc-ad-sdk-origin');
96
+ const OriginSDK = require('qb-pc-ad-sdk-origin');
97
+ // 如果模块导出了对象但未挂载到 window,手动挂载
98
+ if (OriginSDK && !window.GDTAdSDK) {
99
+ window.GDTAdSDK = OriginSDK.default || OriginSDK.GDTAdSDK || OriginSDK;
100
+ }
13
101
  } catch (err) {
14
102
  // 这里不抛出,保持封装层逻辑可继续运行并给出错误回调
15
- console.warn('[AdSDK] 底层 SDK 加载失败,请确认 qb-pc-ad-sdk-origin 已正确安装', err);
103
+ // Vue/React 等环境中,用户可能需要手动引入并挂载
104
+ if (process.env.NODE_ENV !== 'production') {
105
+ console.warn('[AdSDK] 底层 SDK 自动加载失败,若在模块化环境中,请手动引入:',
106
+ 'import \'qb-pc-ad-sdk-origin/dist/qb-pc-ad-sdk.v1.0.0.js\';', err);
107
+ }
16
108
  }
17
109
  }
18
110
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qb-pc-sdk",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "趣变广告 SDK 封装器 - PC端广告接入工具,自动处理多级接口映射与原生渲染逻辑",
5
5
  "main": "index.js",
6
6
  "files": [
@@ -8,6 +8,90 @@
8
8
  // 兼容浏览器和 Node.js 环境
9
9
  const window = typeof global !== 'undefined' && global.window ? global.window : (typeof window !== 'undefined' ? window : global);
10
10
 
11
+ // 拦截并过滤微信游戏SDK相关的错误日志(仅拦截一次)
12
+ if (typeof window !== 'undefined' && window.console && !window.console.error._qbsdkFiltered) {
13
+ const originalError = window.console.error;
14
+ const originalWarn = window.console.warn;
15
+
16
+ // 过滤函数,检查是否应该过滤
17
+ const shouldFilter = function(...args) {
18
+ const errorText = args.join(' ').toLowerCase();
19
+ return (
20
+ errorText.includes('微信') ||
21
+ errorText.includes('wechat') ||
22
+ errorText.includes('weixin') ||
23
+ errorText.includes('wxgame') ||
24
+ errorText.includes('微信游戏') ||
25
+ errorText.includes('微信小游戏') ||
26
+ errorText.includes('wxgamesdkframe') ||
27
+ errorText.includes('localhost.weixin.qq.com') ||
28
+ errorText.includes('wx_game_base') ||
29
+ errorText.includes('getgamesession') ||
30
+ errorText.includes('xmlhttprequest') ||
31
+ errorText.includes('err_failed') ||
32
+ errorText.includes('err_connection_refused') ||
33
+ errorText.includes('cors policy') ||
34
+ errorText.includes('secure context') ||
35
+ errorText.includes('loopback') ||
36
+ errorText.includes('more-private address space')
37
+ );
38
+ };
39
+
40
+ const filteredError = function(...args) {
41
+ // 如果不是微信相关的错误,正常输出
42
+ if (!shouldFilter(...args)) {
43
+ originalError.apply(window.console, args);
44
+ }
45
+ };
46
+
47
+ const filteredWarn = function(...args) {
48
+ // 如果不是微信相关的警告,正常输出
49
+ if (!shouldFilter(...args)) {
50
+ originalWarn.apply(window.console, args);
51
+ }
52
+ };
53
+
54
+ // 标记已过滤,避免重复拦截
55
+ filteredError._qbsdkFiltered = true;
56
+ filteredWarn._qbsdkFiltered = true;
57
+ window.console.error = filteredError;
58
+ window.console.warn = filteredWarn;
59
+
60
+ // 拦截全局错误事件,过滤微信游戏SDK相关的错误
61
+ if (!window._qbsdkErrorHandlerAdded) {
62
+ const originalOnError = window.onerror;
63
+ window.onerror = function(message, source, lineno, colno, error) {
64
+ const errorText = (message || '').toLowerCase() + (source || '').toLowerCase();
65
+ if (shouldFilter(errorText)) {
66
+ // 静默处理,不输出
67
+ return true; // 阻止默认错误处理
68
+ }
69
+ // 其他错误正常处理
70
+ if (originalOnError) {
71
+ return originalOnError.call(this, message, source, lineno, colno, error);
72
+ }
73
+ return false;
74
+ };
75
+
76
+ // 拦截未捕获的 Promise rejection
77
+ const originalUnhandledRejection = window.onunhandledrejection;
78
+ window.addEventListener('unhandledrejection', function(event) {
79
+ const errorText = (event.reason?.message || event.reason || '').toString().toLowerCase();
80
+ if (shouldFilter(errorText)) {
81
+ // 阻止默认行为,静默处理
82
+ event.preventDefault();
83
+ return;
84
+ }
85
+ // 其他错误正常处理
86
+ if (originalUnhandledRejection) {
87
+ originalUnhandledRejection.call(window, event);
88
+ }
89
+ });
90
+
91
+ window._qbsdkErrorHandlerAdded = true;
92
+ }
93
+ }
94
+
11
95
  // 内部常量配置
12
96
  const API_CONFIG = {
13
97
  INIT: 'http://test.qubiankeji.com:8084/pc/init',
@@ -114,12 +198,35 @@
114
198
  _checkAndRun() {
115
199
  let attempts = 0;
116
200
  const check = () => {
201
+ // 优先检查 window.GDTAdSDK
117
202
  if (window.GDTAdSDK) {
118
203
  this._loadAd();
119
- } else if (attempts++ < 50) {
204
+ return;
205
+ }
206
+
207
+ // 尝试从可能的模块导出中获取(适用于 Vue/React 等模块化环境)
208
+ // 检查是否有通过 require/import 导入的模块
209
+ if (typeof require !== 'undefined') {
210
+ try {
211
+ const OriginSDK = require('qb-pc-ad-sdk-origin');
212
+ // 如果模块导出了 GDTAdSDK 或 default,尝试挂载到 window
213
+ if (OriginSDK && !window.GDTAdSDK) {
214
+ window.GDTAdSDK = OriginSDK.default || OriginSDK.GDTAdSDK || OriginSDK;
215
+ if (window.GDTAdSDK) {
216
+ this._loadAd();
217
+ return;
218
+ }
219
+ }
220
+ } catch (e) {
221
+ // require 失败,继续轮询
222
+ }
223
+ }
224
+
225
+ // 轮询等待
226
+ if (attempts++ < 50) {
120
227
  setTimeout(check, 100);
121
228
  } else {
122
- this._handleError('SDK Load Timeout', '底层SDK加载超时');
229
+ this._handleError('SDK Load Timeout', '底层SDK加载超时,请确保已正确引入 qb-pc-ad-sdk-origin');
123
230
  }
124
231
  };
125
232
  check();
@@ -23,6 +23,21 @@
23
23
  <script src="ad-sdk-wrapper.js"></script>
24
24
  <script>
25
25
  window.addEventListener('DOMContentLoaded', () => {
26
+ // 检查底层 SDK 是否加载
27
+ if (!window.GDTAdSDK) {
28
+ console.error('❌ 底层 SDK (GDTAdSDK) 未加载,请检查脚本路径');
29
+ return;
30
+ }
31
+ console.log('✅ 底层 SDK 加载成功');
32
+
33
+ // 检查封装 SDK 是否加载
34
+ if (!window.AdSDK) {
35
+ console.error('❌ 封装 SDK (AdSDK) 未加载,请检查 ad-sdk-wrapper.js 路径');
36
+ return;
37
+ }
38
+ console.log('✅ 封装 SDK 加载成功');
39
+
40
+ // 初始化广告
26
41
  new window.AdSDK({
27
42
  appId: '1999336062823956569',
28
43
  placementId: '1999381081819709520',