drgame-cc 1.0.62 → 1.0.64

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.
Files changed (45) hide show
  1. package/drres/focus/focus_1/gesture.atlas +34 -34
  2. package/drres/focus/focus_2/gesture.atlas +41 -41
  3. package/drres/focus/focus_3/gesture.atlas +34 -34
  4. package/drres/focus/focus_4/gesture.atlas +20 -20
  5. package/drres/prefab/HelperWin.prefab +508 -508
  6. package/drscript/PlatformAdapter.ts +2 -2
  7. package/drscript/ad-sdk/README.md +78 -12
  8. package/drscript/ad-sdk/ad-sdk.ts +417 -0
  9. package/drscript/ad-sdk/ad-sdk.ts.meta +10 -0
  10. package/drscript/ad-sdk/adapters/xiaomi-adapter.ts +497 -0
  11. package/drscript/ad-sdk/adapters/{xiaomi-adapter.js.meta → xiaomi-adapter.ts.meta} +9 -9
  12. package/drscript/ad-sdk/event-emitter.ts +66 -0
  13. package/drscript/ad-sdk/event-emitter.ts.meta +10 -0
  14. package/drscript/ad-sdk/leaderboard/leaderboard.ts +228 -0
  15. package/drscript/ad-sdk/leaderboard/leaderboard.ts.meta +10 -0
  16. package/drscript/ad-sdk/package.json +18 -17
  17. package/drscript/ad-sdk/reporters/reporter.ts +515 -0
  18. package/drscript/ad-sdk/reporters/reporter.ts.meta +10 -0
  19. package/drscript/ad-sdk/reporters/superset-lewo.ts +464 -0
  20. package/drscript/ad-sdk/reporters/superset-lewo.ts.meta +10 -0
  21. package/drscript/ad-sdk/types/enums.ts +103 -0
  22. package/drscript/ad-sdk/types/enums.ts.meta +10 -0
  23. package/drscript/ad-sdk/types/{index.d.ts → index.ts} +1 -1
  24. package/drscript/ad-sdk/types/index.ts.meta +10 -0
  25. package/drscript/ad-sdk/types/{interfaces.d.ts → interfaces.ts} +63 -10
  26. package/drscript/ad-sdk/types/interfaces.ts.meta +10 -0
  27. package/drscript/ad-sdk/user-gamedata/user-gamedata.ts +219 -0
  28. package/drscript/ad-sdk/user-gamedata/user-gamedata.ts.meta +10 -0
  29. package/drscript/ad-sdk/user-gamedata.meta +13 -0
  30. package/package.json +1 -1
  31. package/drscript/ad-sdk/ad-sdk.d.ts +0 -59
  32. package/drscript/ad-sdk/ad-sdk.js +0 -338
  33. package/drscript/ad-sdk/adapters/xiaomi-adapter.d.ts +0 -29
  34. package/drscript/ad-sdk/adapters/xiaomi-adapter.d.ts.meta +0 -6
  35. package/drscript/ad-sdk/adapters/xiaomi-adapter.js +0 -452
  36. package/drscript/ad-sdk/event-emitter.d.ts +0 -12
  37. package/drscript/ad-sdk/event-emitter.js +0 -65
  38. package/drscript/ad-sdk/leaderboard/leaderboard.d.ts +0 -23
  39. package/drscript/ad-sdk/leaderboard/leaderboard.js +0 -193
  40. package/drscript/ad-sdk/reporters/reporter.d.ts +0 -85
  41. package/drscript/ad-sdk/reporters/reporter.js +0 -500
  42. package/drscript/ad-sdk/reporters/superset-lewo.js +0 -574
  43. package/drscript/ad-sdk/types/enums.d.ts +0 -66
  44. package/drscript/ad-sdk/types/enums.js +0 -113
  45. package/drscript/ad-sdk/types/index.js +0 -15
@@ -33,7 +33,7 @@ export class PlatformAdapter {
33
33
  */
34
34
  public static async init(cnName: string, minigameID: number, focusIcon: FingerStyle = FingerStyle.Default) {
35
35
  // ── 初始化渠道类型 ──
36
- this.appItem = PlatformUtil.getUrlParam('item') as EAppItem || EAppItem.LeWo;
36
+ this.appItem = PlatformUtil.getUrlParam('item') as EAppItem || EAppItem.XiaomiTV;
37
37
  this.isVIP = PlatformUtil.getUrlParam('isVIP') === '1';
38
38
  this.cpId = 'cp_001';
39
39
  this.contentId = minigameID.toString();
@@ -99,7 +99,7 @@ export class PlatformAdapter {
99
99
  return this.canWatchVideo && !this.isVIP;
100
100
  }
101
101
  private static get needTimeLimit() {
102
- return !this.isVIP;
102
+ return !this.isVIP && this.appItem === EAppItem.Migu;
103
103
  }
104
104
 
105
105
  /** 奖励模式 */
@@ -11,20 +11,21 @@
11
11
  ```
12
12
  your-project/
13
13
  └── ad-sdk/
14
- ├── ad-sdk.js # 主入口
15
- ├── ad-sdk.d.ts # 类型声明(TS 项目自动提示)
16
- ├── event-emitter.js / .d.ts
14
+ ├── ad-sdk.ts # 主入口
15
+ ├── event-emitter.ts
17
16
  ├── types/
18
- │ ├── enums.js / .d.ts
19
- │ ├── interfaces.d.ts
20
- │ └── index.js / .d.ts
17
+ │ ├── enums.ts
18
+ │ ├── interfaces.d.ts # 纯类型声明
19
+ │ └── index.ts
21
20
  ├── adapters/
22
- │ └── xiaomi-adapter.js / .d.ts
21
+ │ └── xiaomi-adapter.ts
23
22
  ├── reporters/
24
- │ ├── reporter.js / .d.ts # 上报模块封装
25
- │ └── superset-lewo.js # 上报底层脚本
26
- └── leaderboard/
27
- └── leaderboard.js / .d.ts # 排行榜模块
23
+ │ ├── reporter.ts # 上报模块封装
24
+ │ └── superset-lewo.ts # 上报底层脚本
25
+ ├── leaderboard/
26
+ │ └── leaderboard.ts # 排行榜模块
27
+ └── user-gamedata/
28
+ └── user-gamedata.ts # 用户游戏数据模块
28
29
  ```
29
30
 
30
31
  注意:不要复制 build.js,node_modules,package-lock.json,dist文件 cocos中会报错
@@ -247,6 +248,71 @@ Leaderboard.setUserId(account.uid);
247
248
  | `avatar` | string | 头像 URL(从 json_data 解析) |
248
249
  | `json_data` | string | 扩展数据(JSON 字符串) |
249
250
 
251
+ ## 用户游戏数据
252
+
253
+ SDK 内置用户游戏数据模块,支持用户游戏 JSON 数据的增加与获取,接口类型为 `application/json`。
254
+
255
+ ### 1. 初始化
256
+
257
+ ```js
258
+ import { UserGameData } from "../ad-sdk/ad-sdk";
259
+
260
+ // 游戏启动时调用一次
261
+ UserGameData.init({
262
+ project: 'xmjump', // 产品编码(必填)
263
+ add_url: 'https://xxx/API_USER/user/gamedata/add', // 增加数据接口(不传用默认)
264
+ get_url: 'https://xxx/API_USER/user/gamedata/get', // 获取数据接口(不传用默认)
265
+ platform: 'hyp', // 游戏平台(可选):hyp-互影派(默认), lewo-乐蜗
266
+ });
267
+ ```
268
+
269
+ ### 2. 增加用户游戏数据
270
+
271
+ ```js
272
+ var result = await UserGameData.addData({
273
+ userId: 'user_123', // 用户账号(必填)
274
+ project: 'xmjump', // 产品编码(不传用 init 时设置的)
275
+ json: JSON.stringify({ level: 5, coin: 100 }), // 用户游戏 JSON 数据(可选)
276
+ streamNo: 'xxx', // 流水号(可选)
277
+ platform: 'hyp', // 游戏平台(可选)
278
+ });
279
+ ```
280
+
281
+ ### 3. 获取用户游戏数据
282
+
283
+ ```js
284
+ var result = await UserGameData.getData({
285
+ userId: 'user_123', // 用户账号(不传用 init 时设置的)
286
+ project: 'xmjump', // 产品编码(不传用 init 时设置的)
287
+ });
288
+ ```
289
+
290
+ ### 4. 用户登录后更新 user_id
291
+
292
+ ```js
293
+ UserGameData.setUserId(account.uid);
294
+ ```
295
+
296
+ ### API
297
+
298
+ | 方法 | 说明 |
299
+ |------|------|
300
+ | `UserGameData.init(config)` | 初始化用户游戏数据模块 |
301
+ | `UserGameData.addData(params)` | 增加用户游戏数据 |
302
+ | `UserGameData.getData(params)` | 获取用户游戏数据 |
303
+ | `UserGameData.setUserId(user_id)` | 更新用户ID |
304
+ | `UserGameData.getProject()` | 获取当前项目编码 |
305
+
306
+ ### 增加数据字段
307
+
308
+ | 字段 | 类型 | 说明 |
309
+ |------|------|------|
310
+ | `streamNo` | string | 流水号(可选) |
311
+ | `userId` | string | 用户账号(必填) |
312
+ | `project` | string | 产品编码(必填) |
313
+ | `json` | string | 用户游戏 JSON 数据(可选) |
314
+ | `platform` | string | 游戏平台:互影派-hyp(默认),乐蜗-lewo |
315
+
250
316
  ## 遥控器按键 (可选)
251
317
 
252
318
  Native 通过 JSBridge 实时推送遥控器按键事件给 H5,SDK 已封装为 `onKeyEvent`,支持按下和松开两种事件,方便实现长按、连发、释放等操作。
@@ -341,4 +407,4 @@ AdSdk.onKeyEvent(function (e) {
341
407
  | 0 | `AdErrorCode.Success` | 成功 |
342
408
  | -1 | `AdErrorCode.Unknown` | 通用错误 |
343
409
  | 2001 | `AdErrorCode.NotInitialized` | SDK 未初始化 |
344
- | 2002 | `AdErrorCode.PlatformNotSupported` | 平台不支持 |
410
+ | 2002 | `AdErrorCode.PlatformNotSupported` | 平台不支持 |
@@ -0,0 +1,417 @@
1
+ /**
2
+ * 聚合广告 SDK - 主入口
3
+ *
4
+ * 使用方式:
5
+ * import { AdSdk, AdPlatform, AdEvent } from './ad-sdk';
6
+ * await AdSdk.init({ platform: AdPlatform.Xiaomi });
7
+ * const result = await AdSdk.requestAd({ cpId: 'cp_001', rewardType: 'extra_life', triggerScene: 'game_over' });
8
+ */
9
+
10
+ import { AdPlatform, AdEvent, AdErrorCode, AdType, DevicePlatform, KeyCode, KeyAction } from './types/enums';
11
+ import { XiaomiAdapter } from './adapters/xiaomi-adapter';
12
+ import { EventEmitter } from './event-emitter';
13
+ import { Reporter, ActionType } from './reporters/reporter';
14
+ import { Leaderboard } from './leaderboard/leaderboard';
15
+ import { UserGameData } from './user-gamedata/user-gamedata';
16
+ import {
17
+ IAdSdk,
18
+ IAdSdkInitConfig,
19
+ IAdRequest,
20
+ IAdRewardResult,
21
+ IDeviceInfo,
22
+ IAccountInfo,
23
+ IEventHandler,
24
+ IKeyEventHandler,
25
+ IAdAdapter,
26
+ } from './types/interfaces';
27
+ const KEY_EVENT_NAME = '__key_event__';
28
+
29
+ /** 已注册自定义适配器的平台集合 */
30
+ type AdapterConstructor = new () => IAdAdapter;
31
+
32
+ // ────────────────────────────────────────
33
+ // 适配器注册表
34
+ // ────────────────────────────────────────
35
+
36
+ const BUILTIN_ADAPTERS: Record<string, AdapterConstructor> = {};
37
+ BUILTIN_ADAPTERS[AdPlatform.Xiaomi] = XiaomiAdapter;
38
+ // 后续扩展:
39
+ // BUILTIN_ADAPTERS[AdPlatform.Huawei] = HuaweiAdapter;
40
+ // BUILTIN_ADAPTERS[AdPlatform.Tencent] = TencentAdapter;
41
+
42
+ // ────────────────────────────────────────
43
+ // SDK 实现
44
+ // ────────────────────────────────────────
45
+
46
+ class AdSdkImpl implements IAdSdk {
47
+ _initialized: boolean;
48
+ _currentPlatform: AdPlatform;
49
+ _adapters: Map<AdPlatform, IAdAdapter>;
50
+ _emitter: EventEmitter;
51
+ _globalEventHandler: IEventHandler | null;
52
+ _keyHandlers: IKeyEventHandler[];
53
+ _adapterKeyHandler: IKeyEventHandler | null;
54
+
55
+ constructor() {
56
+ this._initialized = false;
57
+ this._currentPlatform = AdPlatform.Xiaomi;
58
+ this._adapters = new Map();
59
+ this._emitter = new EventEmitter();
60
+ this._globalEventHandler = null;
61
+ this._keyHandlers = [];
62
+ this._adapterKeyHandler = null;
63
+ }
64
+
65
+ get currentPlatform(): AdPlatform {
66
+ return this._currentPlatform;
67
+ }
68
+
69
+ /**
70
+ * 初始化 SDK
71
+ */
72
+ async init(config: IAdSdkInitConfig): Promise<void> {
73
+ if (this._initialized) {
74
+ console.warn('[AdSdk] Already initialized. Call destroy() first if you need to re-init.');
75
+ return;
76
+ }
77
+
78
+ this._currentPlatform = config.platform;
79
+ this._globalEventHandler = (config as any).onEvent || null;
80
+
81
+ // 注册自定义适配器(如提供了 customAdapters 兼容旧用法)
82
+ const customAdapters = (config as any).customAdapters as IAdAdapter[] | undefined;
83
+ if (customAdapters) {
84
+ for (const adapter of customAdapters) {
85
+ this._adapters.set(adapter.platform, adapter);
86
+ }
87
+ }
88
+
89
+ // 注册内置适配器(不覆盖自定义的)
90
+ if (!this._adapters.has(config.platform)) {
91
+ const AdapterClass = BUILTIN_ADAPTERS[config.platform];
92
+ if (!AdapterClass) {
93
+ throw new Error(
94
+ '[AdSdk] No adapter found for platform "' + config.platform + '". ' +
95
+ 'Available: ' + Object.keys(BUILTIN_ADAPTERS).join(', ') + '. ' +
96
+ 'You can also provide a custom adapter via config.customAdapters.'
97
+ );
98
+ }
99
+ const instance = new AdapterClass();
100
+ this._adapters.set(config.platform, instance);
101
+ }
102
+
103
+ // 初始化当前平台的适配器(从 config.cpId 构建适配器配置)
104
+ const adapter = this._adapters.get(config.platform) as IAdAdapter;
105
+ const adapterConfig = { cpId: config.cpId };
106
+ await adapter.init(adapterConfig);
107
+
108
+ // 桥接适配器事件到全局
109
+ const self = this;
110
+ const events = Object.values(AdEvent);
111
+ for (let i = 0; i < events.length; i++) {
112
+ const evt = events[i];
113
+ adapter.on(evt, function (data: any) {
114
+ self._emitter.emit(evt, data);
115
+ if (self._globalEventHandler) {
116
+ self._globalEventHandler(data);
117
+ }
118
+ });
119
+ }
120
+
121
+ // 桥接适配器的退出事件 → 调用 reporter 上报退出
122
+ adapter.on(AdEvent.Exit, function () {
123
+ Reporter.reportAppExit();
124
+ });
125
+
126
+ // 桥接适配器的按键事件
127
+ if (adapter.onKeyEvent) {
128
+ self._adapterKeyHandler = function (keyEvent) {
129
+ for (let j = 0; j < self._keyHandlers.length; j++) {
130
+ try {
131
+ self._keyHandlers[j](keyEvent);
132
+ } catch (e) {
133
+ console.error('[AdSdk] Key event handler error:', e);
134
+ }
135
+ }
136
+ };
137
+ adapter.onKeyEvent(self._adapterKeyHandler);
138
+ }
139
+
140
+ // 自动初始化排行榜模块(serverUrl/project/platform 由 ad-sdk 统一处理)
141
+ Leaderboard.init({
142
+ serverUrl: config.serverUrl,
143
+ project: config.project,
144
+ platform: config.gamePlatform,
145
+ });
146
+
147
+ // 自动初始化用户游戏数据模块(serverUrl/project/platform 由 ad-sdk 统一处理)
148
+ UserGameData.init({
149
+ serverUrl: config.serverUrl,
150
+ project: config.project,
151
+ platform: config.gamePlatform,
152
+ });
153
+
154
+ // 自动初始化数据上报模块(传入 reporter 配置,无配置时使用空对象默认初始化)
155
+ Reporter.init(config.reporter || {});
156
+
157
+ this._initialized = true;
158
+ console.log('[AdSdk] Initialized with platform: ' + config.platform);
159
+
160
+ // 上报「启动」事件
161
+ Reporter.reportAppStart();
162
+
163
+ // 尝试拉取账号信息,作为排行榜/玩家数据/数据上报的默认 userId(失败则保留默认值)
164
+ this._syncUserIdFromAccount();
165
+
166
+ console.log('[AdSdk] Lifecycle reporting bound.');
167
+ }
168
+
169
+ /**
170
+ * 尝试从 getAccount() 拉取账号 uid,同步为各模块默认 userId。
171
+ * 获取失败或无 uid 时,使用本机持久化的设备 ID 作为默认 userId。
172
+ */
173
+ private async _syncUserIdFromAccount(): Promise<void> {
174
+ let uid = '';
175
+ try {
176
+ const account = await this.getAccount();
177
+ uid = account && account.uid ? account.uid : '';
178
+ } catch (error) {
179
+ console.warn('[AdSdk] getAccount failed, fallback to device id.', error);
180
+ }
181
+
182
+ // getAccount 失败或无 uid 时,使用本机持久化的设备 ID 作为默认 userId
183
+ if (!uid) {
184
+ uid = defaultUserId();
185
+ }
186
+ if (!uid) {
187
+ return;
188
+ }
189
+ Leaderboard.setUserId(uid);
190
+ UserGameData.setUserId(uid);
191
+ Reporter.setCommonInfo({ uid: uid, user_id: uid });
192
+ console.log('[AdSdk] Default userId synced:', uid);
193
+ }
194
+
195
+ /**
196
+ * 获取设备信息
197
+ */
198
+ async getDeviceInfo(): Promise<IDeviceInfo> {
199
+ this._ensureInit();
200
+ const adapter = this._getAdapter();
201
+ if (adapter.getDeviceInfo) {
202
+ return adapter.getDeviceInfo();
203
+ }
204
+ throw new Error('[AdSdk] getDeviceInfo is not supported by the current adapter.');
205
+ }
206
+
207
+ /**
208
+ * 获取玩家账户信息
209
+ */
210
+ async getAccount(): Promise<IAccountInfo> {
211
+ this._ensureInit();
212
+ const adapter = this._getAdapter();
213
+ if (adapter.getAccount) {
214
+ return adapter.getAccount();
215
+ }
216
+ throw new Error('[AdSdk] getAccount is not supported by the current adapter.');
217
+ }
218
+
219
+ /**
220
+ * 请求播放广告
221
+ */
222
+ async requestAd(request: IAdRequest): Promise<IAdRewardResult> {
223
+ this._ensureInit();
224
+ return this._getAdapter().requestAd(request);
225
+ }
226
+
227
+ /**
228
+ * 通知游戏加载完成
229
+ */
230
+ onGameReady(version: string): void {
231
+ this._ensureInit();
232
+ const adapter = this._getAdapter();
233
+ if (adapter.onGameReady) {
234
+ adapter.onGameReady(version);
235
+ }
236
+ }
237
+
238
+ /** 通知游戏暂停(自动上报切后台) */
239
+ onGamePause(): void {
240
+ this._ensureInit();
241
+ Reporter.reportSwitchBackground();
242
+ const adapter = this._getAdapter();
243
+ if (adapter.onGamePause) {
244
+ adapter.onGamePause();
245
+ }
246
+ }
247
+
248
+ /** 通知游戏恢复(自动上报切回) */
249
+ onGameResume(): void {
250
+ this._ensureInit();
251
+ Reporter.reportSwitchBack();
252
+ const adapter = this._getAdapter();
253
+ if (adapter.onGameResume) {
254
+ adapter.onGameResume();
255
+ }
256
+ }
257
+
258
+ /**
259
+ * 退出游戏(自动上报退出事件后执行实际退出)
260
+ */
261
+ async exitGame(): Promise<void> {
262
+ this._ensureInit();
263
+ // 通知适配器执行退出,适配器的 onExitConfirmed 回调会触发上报
264
+ const adapter = this._getAdapter();
265
+ if (adapter.exitGame) {
266
+ return adapter.exitGame();
267
+ }
268
+ }
269
+
270
+ /**
271
+ * 监听广告事件
272
+ */
273
+ on(event: AdEvent, handler: IEventHandler): void {
274
+ this._emitter.on(event, handler);
275
+ }
276
+
277
+ /**
278
+ * 取消监听
279
+ */
280
+ off(event: AdEvent, handler?: IEventHandler): void {
281
+ this._emitter.off(event, handler);
282
+ }
283
+
284
+ /**
285
+ * 监听遥控器按键事件
286
+ */
287
+ onKeyEvent(handler: IKeyEventHandler): void {
288
+ if (typeof handler === 'function' && this._keyHandlers.indexOf(handler) === -1) {
289
+ this._keyHandlers.push(handler);
290
+ }
291
+ }
292
+
293
+ /**
294
+ * 取消监听遥控器按键事件
295
+ */
296
+ offKeyEvent(handler?: IKeyEventHandler): void {
297
+ if (!handler) {
298
+ this._keyHandlers = [];
299
+ } else {
300
+ const idx = this._keyHandlers.indexOf(handler);
301
+ if (idx !== -1) {
302
+ this._keyHandlers.splice(idx, 1);
303
+ }
304
+ }
305
+ }
306
+
307
+ /**
308
+ * 切换广告平台
309
+ */
310
+ switchPlatform(platform: AdPlatform): void {
311
+ if (platform === this._currentPlatform) return;
312
+
313
+ const adapter = this._adapters.get(platform);
314
+ if (!adapter) {
315
+ throw new Error('[AdSdk] Platform "' + platform + '" not registered. Init with it first.');
316
+ }
317
+
318
+ this._currentPlatform = platform;
319
+ console.log('[AdSdk] Switched to platform: ' + platform);
320
+ }
321
+
322
+ /** 销毁 SDK */
323
+ destroy(): void {
324
+ // 清理适配器的按键桥接
325
+ const adapter = this._getAdapter();
326
+ if (adapter && adapter.offKeyEvent && this._adapterKeyHandler) {
327
+ adapter.offKeyEvent(this._adapterKeyHandler);
328
+ }
329
+
330
+ this._adapters.forEach(function (adp) {
331
+ adp.destroy();
332
+ });
333
+ this._adapters.clear();
334
+ this._emitter.removeAllListeners();
335
+ this._globalEventHandler = null;
336
+ this._keyHandlers = [];
337
+ this._adapterKeyHandler = null;
338
+ this._initialized = false;
339
+ }
340
+
341
+ // ────────────────────────────────────────
342
+ // 内部
343
+ // ────────────────────────────────────────
344
+
345
+ _ensureInit(): void {
346
+ if (!this._initialized) {
347
+ throw new Error('[AdSdk] SDK not initialized. Call AdSdk.init() first.');
348
+ }
349
+ }
350
+
351
+ _getAdapter(): IAdAdapter {
352
+ return this._adapters.get(this._currentPlatform) as IAdAdapter;
353
+ }
354
+ }
355
+
356
+ // ────────────────────────────────────────
357
+ // 导出单例
358
+ // ────────────────────────────────────────
359
+
360
+ const AdSdk: IAdSdk = new AdSdkImpl();
361
+
362
+ // 命名导出
363
+ export {
364
+ // 单例
365
+ AdSdk,
366
+
367
+ // 枚举
368
+ AdPlatform,
369
+ AdType,
370
+ AdEvent,
371
+ AdErrorCode,
372
+ DevicePlatform,
373
+ KeyCode,
374
+ KeyAction,
375
+
376
+ // 数据上报
377
+ Reporter,
378
+ ActionType,
379
+
380
+ // 排行榜
381
+ Leaderboard,
382
+
383
+ // 用户游戏数据
384
+ UserGameData,
385
+
386
+ // 类
387
+ XiaomiAdapter,
388
+ EventEmitter,
389
+ };
390
+
391
+ const DEVICE_ID_KEY = 'ad-sdk.device_id';
392
+ const MAX_USER_ID_LEN = 12;
393
+
394
+ /** 生成本机持久化的设备 ID(仅字母数字,用于访问时兜底 userId) */
395
+ function defaultUserId(): string {
396
+ let id = '';
397
+ try {
398
+ if (typeof localStorage !== 'undefined') {
399
+ id = localStorage.getItem(DEVICE_ID_KEY) || '';
400
+ }
401
+ } catch (e) { /* ignore */ }
402
+
403
+ if (!id) {
404
+ // 用时间戳 + 随机数组成 ID,去除非法字符并截断
405
+ const raw = String(Date.now()) + Math.random().toString(36).slice(2);
406
+ id = raw.replace(/[^a-zA-Z0-9]/g, '').slice(0, MAX_USER_ID_LEN);
407
+ try {
408
+ if (typeof localStorage !== 'undefined') {
409
+ localStorage.setItem(DEVICE_ID_KEY, id);
410
+ }
411
+ } catch (e) { /* ignore */ }
412
+ }
413
+
414
+ return String(id).replace(/[^a-zA-Z0-9]/g, '').slice(0, MAX_USER_ID_LEN);
415
+ }
416
+
417
+ export default AdSdk;
@@ -0,0 +1,10 @@
1
+ {
2
+ "ver": "1.1.0",
3
+ "uuid": "58be979d-4a4e-4ad1-998c-f29c2a8e3e6d",
4
+ "importer": "typescript",
5
+ "isPlugin": false,
6
+ "loadPluginInWeb": true,
7
+ "loadPluginInNative": true,
8
+ "loadPluginInEditor": false,
9
+ "subMetas": {}
10
+ }