drgame-cc 1.0.41 → 1.0.43

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.
@@ -1,344 +1,344 @@
1
- # 聚合广告 SDK
2
-
3
- 电视大屏游戏广告接入,3 步搞定。
4
-
5
- ---
6
-
7
- ## 1. 复制文件
8
-
9
- 将 `ad-sdk` 文件夹复制到项目中:
10
-
11
- ```
12
- your-project/
13
- └── ad-sdk/
14
- ├── ad-sdk.js # 主入口
15
- ├── ad-sdk.d.ts # 类型声明(TS 项目自动提示)
16
- ├── event-emitter.js / .d.ts
17
- ├── types/
18
- │ ├── enums.js / .d.ts
19
- │ ├── interfaces.d.ts
20
- │ └── index.js / .d.ts
21
- ├── adapters/
22
- │ └── xiaomi-adapter.js / .d.ts
23
- ├── reporters/
24
- │ ├── reporter.js / .d.ts # 上报模块封装
25
- │ └── superset-lewo.js # 上报底层脚本
26
- └── leaderboard/
27
- └── leaderboard.js / .d.ts # 排行榜模块
28
- ```
29
-
30
- 注意:不要复制 build.js,node_modules,package-lock.json,dist文件 cocos中会报错
31
-
32
- ## 2. 初始化
33
-
34
- ```js
35
- import { AdSdk, AdPlatform, AdEvent } from "../ad-sdk/ad-sdk";
36
-
37
- // 游戏启动时调用一次
38
- await AdSdk.init({ platform: AdPlatform.Xiaomi });
39
- ```
40
-
41
- ## 3. 请求广告 + 监听事件
42
-
43
- ```js
44
- // 监听奖励(用户完整看完广告触发)
45
- AdSdk.on(AdEvent.Reward, function (data) {
46
- console.log("发放奖励", data.requestId);
47
- giveReward();
48
- });
49
-
50
- // 监听失败
51
- AdSdk.on(AdEvent.Error, function (data) {
52
- console.log("广告失败", data.code, data.message);
53
- });
54
-
55
- // 请求广告
56
- await AdSdk.requestAd({
57
- reward_type: 'extra_life', // CP 自定义类型
58
- trigger_scene: 'game_over', // CP 自定义场景
59
- });
60
- ```
61
- trigger_scene: 要求如下定义
62
- 使用道具 use_prop
63
- 开始游戏 start_game
64
- 复活弹窗 revive_pop
65
- 购买皮肤 buy_skin
66
- 购买道具 buy_prop
67
- 游戏结束 game_over
68
- 关卡通过 level_complete
69
- 商店/道具 shop
70
- 每日奖励 daily_reward
71
- 加速 boost
72
- ---
73
-
74
- ## 生命周期
75
-
76
- ```js
77
- AdSdk.onGameReady("1.0.0"); // 游戏加载完成 (必须)
78
- AdSdk.onGamePause(); // 游戏暂停(可选)
79
- AdSdk.onGameResume(); // 游戏恢复(可选)
80
- await AdSdk.exitGame(); // 退出游戏(可选)
81
- ```
82
-
83
- ## 获取设备信息
84
-
85
- ```js
86
- const info = await AdSdk.getDeviceInfo();
87
- console.log(info.platform); // 'tv'
88
- console.log(info.osVersion); // 系统版本
89
- console.log(info.model); // 设备型号
90
- ```
91
-
92
- ## 获取玩家账户信息
93
-
94
- ```js
95
- const account = await AdSdk.getAccount();
96
- console.log(account.uid); // 用户唯一标识
97
- console.log(account.nickname); // 用户昵称
98
- console.log(account.avatar); // 用户头像 URL
99
- ```
100
-
101
- ## 数据上报
102
-
103
- SDK 内置数据上报模块,CP 方通过 `Reporter` 统一调用。
104
-
105
- ### 1. 初始化
106
-
107
- ```js
108
- import { Reporter, ActionType } from "../ad-sdk/ad-sdk";
109
-
110
- // 游戏启动时调用一次
111
- Reporter.init({
112
- report_url: 'https://sup.daoran.tv/bi-api/api/game/lewo/batch', // 上报地址(不传用默认)
113
- app_item: '29', // 渠道编码
114
- content_id: 'game_001', // 游戏ID
115
- content_title: '我的游戏', // 游戏名
116
- });
117
- ```
118
-
119
- ### 2. 单次上报
120
-
121
- ```js
122
- Reporter.report({
123
- user_id: 'user_123', // 用户ID(登录后设置)
124
- event_name: 'game_start', // 事件名
125
- action_type: ActionType.Exposure, // 曝光
126
- });
127
- ```
128
-
129
- ### 3. 批量上报
130
-
131
- ```js
132
- Reporter.reportBatch([
133
- { user_id: 'user_123', event_name: 'game_start', action_type: ActionType.Exposure },
134
- { user_id: 'user_123', event_name: 'level_complete', action_type: ActionType.Click },
135
- ]);
136
- ```
137
-
138
- ### 4. 用户登录后更新 user_id
139
-
140
- ```js
141
- Reporter.setCommonInfo({ user_id: account.uid });
142
- ```
143
-
144
- ### 5. 设备ID
145
-
146
- ```js
147
- var deviceId = Reporter.createDeviceId(); // 获取/自动生成设备ID
148
- Reporter.resetDeviceId(); // 重置设备ID
149
- ```
150
-
151
- ### API
152
-
153
- | 方法 | 说明 |
154
- |------|------|
155
- | `Reporter.init(config)` | 初始化上报模块 |
156
- | `Reporter.report(data)` | 单次上报 |
157
- | `Reporter.reportBatch(list, common?)` | 批量上报 |
158
- | `Reporter.createDeviceId()` | 获取/生成设备ID |
159
- | `Reporter.resetDeviceId()` | 重置设备ID |
160
- | `Reporter.setCommonInfo(info)` | 更新公共字段 |
161
- | `Reporter.getCommonInfo()` | 获取当前公共字段 |
162
-
163
- ### 上报字段
164
-
165
- | 字段 | 说明 | 必填 |
166
- |------|------|------|
167
- | `user_id` | 用户唯一标识(需要用户登录,产生UID) | 登录后必填 |
168
- | `device_id` | 设备唯一标识(设备号,如果无,则需要生成) | 自动生成 |
169
- | `app_item` | 渠道编码 | init 时设置 |
170
- | `content_type` | 内容类型(默认"游戏") | init 时设置 |
171
- | `content_id` | 游戏 ID | init 时设置 |
172
- | `content_title` | 游戏名 | init 时设置 |
173
- | `element_position` | 元素位置(埋点范围表对应的元素位置列) | 必填 |
174
- | `action_type` | 行为类型:曝光/点击 | 默认"曝光" |
175
- | `event_name` | 具体事件名(通过元素位置和行为生成事件名字) | 选填 |
176
- | `ad_request_id` | 广告请求 ID | 广告事件必填 |
177
- | `event_time` | 客户端事件时间(yyyy-MM-dd HH:mm:ss) | 自动生成 |
178
-
179
- ## 排行榜
180
-
181
- SDK 内置排行榜模块,支持获取积分排行榜和添加积分。
182
-
183
- ### 1. 初始化
184
-
185
- ```js
186
- import { Leaderboard } from "../ad-sdk/ad-sdk";
187
-
188
- // 游戏启动时调用一次
189
- Leaderboard.init({
190
- project: 'xmjump', // 项目编码(必填)
191
- rank_url: 'https://xxx/api/user/point/rank', // 排行榜接口(不传用默认)
192
- add_url: 'https://xxx/api/user/point/add', // 添加积分接口(不传用默认)
193
- });
194
- ```
195
-
196
- ### 2. 获取积分排行榜
197
-
198
- ```js
199
- var result = await Leaderboard.getRank();
200
- if (result.code === 0) {
201
- var list = result.data; // 排行榜列表
202
- for (var i = 0; i < list.length; i++) {
203
- console.log(list[i].rank, list[i].nickname, list[i].point);
204
- }
205
- } else {
206
- console.error('获取排行榜失败:', result.message);
207
- }
208
- ```
209
-
210
- ### 3. 添加积分
211
-
212
- ```js
213
- var result = await Leaderboard.addPoint({
214
- user_id: 'user_123', // 用户ID(不传用 init 时设置的)
215
- point: 10, // 积分值
216
- json_data: JSON.stringify({ // 扩展数据(可选)
217
- url: 'xxx.png',
218
- nickname: '张三',
219
- }),
220
- });
221
- ```
222
-
223
- ### 4. 用户登录后更新 user_id
224
-
225
- ```js
226
- Leaderboard.setUserId(account.uid);
227
- ```
228
-
229
- ### API
230
-
231
- | 方法 | 说明 |
232
- |------|------|
233
- | `Leaderboard.init(config)` | 初始化排行榜模块 |
234
- | `Leaderboard.getRank()` | 获取积分排行榜 |
235
- | `Leaderboard.addPoint(params)` | 添加积分 |
236
- | `Leaderboard.setUserId(user_id)` | 更新用户ID |
237
- | `Leaderboard.getProject()` | 获取当前项目编码 |
238
-
239
- ### 排行榜字段
240
-
241
- | 字段 | 类型 | 说明 |
242
- |------|------|------|
243
- | `rank` | number | 排名 |
244
- | `user_id` | string | 用户ID |
245
- | `point` | number | 积分 |
246
- | `nickname` | string | 昵称(从 json_data 解析) |
247
- | `avatar` | string | 头像 URL(从 json_data 解析) |
248
- | `json_data` | string | 扩展数据(JSON 字符串) |
249
-
250
- ## 遥控器按键 (可选)
251
-
252
- Native 通过 JSBridge 实时推送遥控器按键事件给 H5,SDK 已封装为 `onKeyEvent`,支持按下和松开两种事件,方便实现长按、连发、释放等操作。
253
-
254
- ### 使用
255
-
256
- ```js
257
- import { AdSdk, KeyCode, KeyAction } from "../ad-sdk/ad-sdk";
258
-
259
- AdSdk.onKeyEvent(function (e) {
260
- var isDown = e.action === KeyAction.Down;
261
-
262
- if (isDown) {
263
- switch (e.key) {
264
- case KeyCode.Enter: handleConfirm(); break;
265
- case KeyCode.Back: showGameMenu(); break;
266
- case KeyCode.Up: movePlayer(0, -1); break;
267
- case KeyCode.Down: movePlayer(0, 1); break;
268
- case KeyCode.Left: movePlayer(-1, 0); break;
269
- case KeyCode.Right: movePlayer(1, 0); break;
270
- case KeyCode.Menu: togglePause(); break;
271
- }
272
- } else {
273
- // 松开(up)— 用于停止移动、结束长按等
274
- stopPlayer();
275
- }
276
- });
277
- ```
278
-
279
- ### API
280
-
281
- | 方法 | 说明 |
282
- |------|------|
283
- | `AdSdk.onKeyEvent(handler)` | 监听按键事件,handler 接收 `{ key, action }` |
284
- | `AdSdk.offKeyEvent(handler?)` | 取消监听,不传 handler 则清除所有 |
285
-
286
- ### 回调数据
287
-
288
- | 字段 | 类型 | 说明 |
289
- |------|------|------|
290
- | `e.key` | string | 按键名称,见下方映射表 |
291
- | `e.action` | string | `"down"` = 按下,`"up"` = 松开 |
292
-
293
- ### 按键映射
294
-
295
- | 遥控器按键 | KeyCode | 实际值 | 说明 |
296
- |-----------|---------|--------|------|
297
- | ↑ 上 | `KeyCode.Up` | `'up'` | 方向键上 |
298
- | ↓ 下 | `KeyCode.Down` | `'down'` | 方向键下 |
299
- | ← 左 | `KeyCode.Left` | `'left'` | 方向键左 |
300
- | → 右 | `KeyCode.Right` | `'right'` | 方向键右 |
301
- | 确认 (OK) | `KeyCode.Enter` | `'enter'` | 中心确认键 |
302
- | 返回 | `KeyCode.Back` | `'back'` | 返回键 |
303
- | 菜单 | `KeyCode.Menu` | `'menu'` | 菜单键 |
304
-
305
- ### 注意事项
306
-
307
- - **同时推送 down 和 up**:按下触发 `action: 'down'`,松开触发 `action: 'up'`,可据此实现长按/连发
308
- - **广告播放期间不推送**:广告播放中不会收到任何按键事件,无需自行屏蔽
309
- - **返回键双击退出**:`back` 键的双击退出逻辑仍在 Native 侧处理,H5 仅收到按键事件通知,常用在页面返回/关闭逻辑
310
- - **不要同时监听 keydown/keyup**:如果 H5 同时自行监听 `keydown/keyup`,可能收到重复事件,建议仅使用 `onKeyEvent`
311
-
312
- ## 广告事件
313
-
314
- | 事件 | 说明 | data |
315
- |------|------|------|
316
- | `AdEvent.Reward` | 观看完成,发放奖励 | `{ requestId, isCompleted }` |
317
- | `AdEvent.Error` | 广告失败 | `{ code, message, requestId }` |
318
- | `AdEvent.Closed` | 广告关闭 | `{ requestId }` |
319
- | `AdEvent.Loaded` | 广告加载完成 | — |
320
- | `AdEvent.Show` | 广告开始展示 | — |
321
- | `AdEvent.Click` | 广告被点击 | — |
322
-
323
- ## 错误码
324
-
325
- ### 广告侧(1xxx)
326
-
327
- | 码 | 常量 | 说明 |
328
- |----|------|------|
329
- | 1001 | `AdErrorCode.AdSwitchOff` | 广告开关关闭 |
330
- | 1002 | `AdErrorCode.NoFill` | 无广告填充,素材池无可用广告 |
331
- | 1003 | `AdErrorCode.Timeout` | 广告请求超时(5秒) |
332
- | 1004 | `AdErrorCode.PlayFailed` | 视频播放失败 |
333
- | 1005 | `AdErrorCode.NoFallbackAd` | 无兜底广告,兜底视频也未配置 |
334
- | 1006 | `AdErrorCode.UserAbandoned` | 用户放弃观看,播放中途按返回键 |
335
- | 1007 | `AdErrorCode.AdInProgress` | 广告播放中,不可重复请求 |
336
-
337
- ### SDK 侧(2xxx)
338
-
339
- | 码 | 常量 | 说明 |
340
- |----|------|------|
341
- | 0 | `AdErrorCode.Success` | 成功 |
342
- | -1 | `AdErrorCode.Unknown` | 通用错误 |
343
- | 2001 | `AdErrorCode.NotInitialized` | SDK 未初始化 |
344
- | 2002 | `AdErrorCode.PlatformNotSupported` | 平台不支持 |
1
+ # 聚合广告 SDK
2
+
3
+ 电视大屏游戏广告接入,3 步搞定。
4
+
5
+ ---
6
+
7
+ ## 1. 复制文件
8
+
9
+ 将 `ad-sdk` 文件夹复制到项目中:
10
+
11
+ ```
12
+ your-project/
13
+ └── ad-sdk/
14
+ ├── ad-sdk.js # 主入口
15
+ ├── ad-sdk.d.ts # 类型声明(TS 项目自动提示)
16
+ ├── event-emitter.js / .d.ts
17
+ ├── types/
18
+ │ ├── enums.js / .d.ts
19
+ │ ├── interfaces.d.ts
20
+ │ └── index.js / .d.ts
21
+ ├── adapters/
22
+ │ └── xiaomi-adapter.js / .d.ts
23
+ ├── reporters/
24
+ │ ├── reporter.js / .d.ts # 上报模块封装
25
+ │ └── superset-lewo.js # 上报底层脚本
26
+ └── leaderboard/
27
+ └── leaderboard.js / .d.ts # 排行榜模块
28
+ ```
29
+
30
+ 注意:不要复制 build.js,node_modules,package-lock.json,dist文件 cocos中会报错
31
+
32
+ ## 2. 初始化
33
+
34
+ ```js
35
+ import { AdSdk, AdPlatform, AdEvent } from "../ad-sdk/ad-sdk";
36
+
37
+ // 游戏启动时调用一次
38
+ await AdSdk.init({ platform: AdPlatform.Xiaomi });
39
+ ```
40
+
41
+ ## 3. 请求广告 + 监听事件
42
+
43
+ ```js
44
+ // 监听奖励(用户完整看完广告触发)
45
+ AdSdk.on(AdEvent.Reward, function (data) {
46
+ console.log("发放奖励", data.requestId);
47
+ giveReward();
48
+ });
49
+
50
+ // 监听失败
51
+ AdSdk.on(AdEvent.Error, function (data) {
52
+ console.log("广告失败", data.code, data.message);
53
+ });
54
+
55
+ // 请求广告
56
+ await AdSdk.requestAd({
57
+ reward_type: 'extra_life', // CP 自定义类型
58
+ trigger_scene: 'game_over', // CP 自定义场景
59
+ });
60
+ ```
61
+ trigger_scene: 要求如下定义
62
+ 使用道具 use_prop
63
+ 开始游戏 start_game
64
+ 复活弹窗 revive_pop
65
+ 购买皮肤 buy_skin
66
+ 购买道具 buy_prop
67
+ 游戏结束 game_over
68
+ 关卡通过 level_complete
69
+ 商店/道具 shop
70
+ 每日奖励 daily_reward
71
+ 加速 boost
72
+ ---
73
+
74
+ ## 生命周期
75
+
76
+ ```js
77
+ AdSdk.onGameReady("1.0.0"); // 游戏加载完成 (必须)
78
+ AdSdk.onGamePause(); // 游戏暂停(可选)
79
+ AdSdk.onGameResume(); // 游戏恢复(可选)
80
+ await AdSdk.exitGame(); // 退出游戏(可选)
81
+ ```
82
+
83
+ ## 获取设备信息
84
+
85
+ ```js
86
+ const info = await AdSdk.getDeviceInfo();
87
+ console.log(info.platform); // 'tv'
88
+ console.log(info.osVersion); // 系统版本
89
+ console.log(info.model); // 设备型号
90
+ ```
91
+
92
+ ## 获取玩家账户信息
93
+
94
+ ```js
95
+ const account = await AdSdk.getAccount();
96
+ console.log(account.uid); // 用户唯一标识
97
+ console.log(account.nickname); // 用户昵称
98
+ console.log(account.avatar); // 用户头像 URL
99
+ ```
100
+
101
+ ## 数据上报
102
+
103
+ SDK 内置数据上报模块,CP 方通过 `Reporter` 统一调用。
104
+
105
+ ### 1. 初始化
106
+
107
+ ```js
108
+ import { Reporter, ActionType } from "../ad-sdk/ad-sdk";
109
+
110
+ // 游戏启动时调用一次
111
+ Reporter.init({
112
+ report_url: 'https://sup.daoran.tv/bi-api/api/game/lewo/batch', // 上报地址(不传用默认)
113
+ app_item: '29', // 渠道编码
114
+ content_id: 'game_001', // 游戏ID
115
+ content_title: '我的游戏', // 游戏名
116
+ });
117
+ ```
118
+
119
+ ### 2. 单次上报
120
+
121
+ ```js
122
+ Reporter.report({
123
+ user_id: 'user_123', // 用户ID(登录后设置)
124
+ event_name: 'game_start', // 事件名
125
+ action_type: ActionType.Exposure, // 曝光
126
+ });
127
+ ```
128
+
129
+ ### 3. 批量上报
130
+
131
+ ```js
132
+ Reporter.reportBatch([
133
+ { user_id: 'user_123', event_name: 'game_start', action_type: ActionType.Exposure },
134
+ { user_id: 'user_123', event_name: 'level_complete', action_type: ActionType.Click },
135
+ ]);
136
+ ```
137
+
138
+ ### 4. 用户登录后更新 user_id
139
+
140
+ ```js
141
+ Reporter.setCommonInfo({ user_id: account.uid });
142
+ ```
143
+
144
+ ### 5. 设备ID
145
+
146
+ ```js
147
+ var deviceId = Reporter.createDeviceId(); // 获取/自动生成设备ID
148
+ Reporter.resetDeviceId(); // 重置设备ID
149
+ ```
150
+
151
+ ### API
152
+
153
+ | 方法 | 说明 |
154
+ |------|------|
155
+ | `Reporter.init(config)` | 初始化上报模块 |
156
+ | `Reporter.report(data)` | 单次上报 |
157
+ | `Reporter.reportBatch(list, common?)` | 批量上报 |
158
+ | `Reporter.createDeviceId()` | 获取/生成设备ID |
159
+ | `Reporter.resetDeviceId()` | 重置设备ID |
160
+ | `Reporter.setCommonInfo(info)` | 更新公共字段 |
161
+ | `Reporter.getCommonInfo()` | 获取当前公共字段 |
162
+
163
+ ### 上报字段
164
+
165
+ | 字段 | 说明 | 必填 |
166
+ |------|------|------|
167
+ | `user_id` | 用户唯一标识(需要用户登录,产生UID) | 登录后必填 |
168
+ | `device_id` | 设备唯一标识(设备号,如果无,则需要生成) | 自动生成 |
169
+ | `app_item` | 渠道编码 | init 时设置 |
170
+ | `content_type` | 内容类型(默认"游戏") | init 时设置 |
171
+ | `content_id` | 游戏 ID | init 时设置 |
172
+ | `content_title` | 游戏名 | init 时设置 |
173
+ | `element_position` | 元素位置(埋点范围表对应的元素位置列) | 必填 |
174
+ | `action_type` | 行为类型:曝光/点击 | 默认"曝光" |
175
+ | `event_name` | 具体事件名(通过元素位置和行为生成事件名字) | 选填 |
176
+ | `ad_request_id` | 广告请求 ID | 广告事件必填 |
177
+ | `event_time` | 客户端事件时间(yyyy-MM-dd HH:mm:ss) | 自动生成 |
178
+
179
+ ## 排行榜
180
+
181
+ SDK 内置排行榜模块,支持获取积分排行榜和添加积分。
182
+
183
+ ### 1. 初始化
184
+
185
+ ```js
186
+ import { Leaderboard } from "../ad-sdk/ad-sdk";
187
+
188
+ // 游戏启动时调用一次
189
+ Leaderboard.init({
190
+ project: 'xmjump', // 项目编码(必填)
191
+ rank_url: 'https://xxx/api/user/point/rank', // 排行榜接口(不传用默认)
192
+ add_url: 'https://xxx/api/user/point/add', // 添加积分接口(不传用默认)
193
+ });
194
+ ```
195
+
196
+ ### 2. 获取积分排行榜
197
+
198
+ ```js
199
+ var result = await Leaderboard.getRank();
200
+ if (result.code === 0) {
201
+ var list = result.data; // 排行榜列表
202
+ for (var i = 0; i < list.length; i++) {
203
+ console.log(list[i].rank, list[i].nickname, list[i].point);
204
+ }
205
+ } else {
206
+ console.error('获取排行榜失败:', result.message);
207
+ }
208
+ ```
209
+
210
+ ### 3. 添加积分
211
+
212
+ ```js
213
+ var result = await Leaderboard.addPoint({
214
+ user_id: 'user_123', // 用户ID(不传用 init 时设置的)
215
+ point: 10, // 积分值
216
+ json_data: JSON.stringify({ // 扩展数据(可选)
217
+ url: 'xxx.png',
218
+ nickname: '张三',
219
+ }),
220
+ });
221
+ ```
222
+
223
+ ### 4. 用户登录后更新 user_id
224
+
225
+ ```js
226
+ Leaderboard.setUserId(account.uid);
227
+ ```
228
+
229
+ ### API
230
+
231
+ | 方法 | 说明 |
232
+ |------|------|
233
+ | `Leaderboard.init(config)` | 初始化排行榜模块 |
234
+ | `Leaderboard.getRank()` | 获取积分排行榜 |
235
+ | `Leaderboard.addPoint(params)` | 添加积分 |
236
+ | `Leaderboard.setUserId(user_id)` | 更新用户ID |
237
+ | `Leaderboard.getProject()` | 获取当前项目编码 |
238
+
239
+ ### 排行榜字段
240
+
241
+ | 字段 | 类型 | 说明 |
242
+ |------|------|------|
243
+ | `rank` | number | 排名 |
244
+ | `user_id` | string | 用户ID |
245
+ | `point` | number | 积分 |
246
+ | `nickname` | string | 昵称(从 json_data 解析) |
247
+ | `avatar` | string | 头像 URL(从 json_data 解析) |
248
+ | `json_data` | string | 扩展数据(JSON 字符串) |
249
+
250
+ ## 遥控器按键 (可选)
251
+
252
+ Native 通过 JSBridge 实时推送遥控器按键事件给 H5,SDK 已封装为 `onKeyEvent`,支持按下和松开两种事件,方便实现长按、连发、释放等操作。
253
+
254
+ ### 使用
255
+
256
+ ```js
257
+ import { AdSdk, KeyCode, KeyAction } from "../ad-sdk/ad-sdk";
258
+
259
+ AdSdk.onKeyEvent(function (e) {
260
+ var isDown = e.action === KeyAction.Down;
261
+
262
+ if (isDown) {
263
+ switch (e.key) {
264
+ case KeyCode.Enter: handleConfirm(); break;
265
+ case KeyCode.Back: showGameMenu(); break;
266
+ case KeyCode.Up: movePlayer(0, -1); break;
267
+ case KeyCode.Down: movePlayer(0, 1); break;
268
+ case KeyCode.Left: movePlayer(-1, 0); break;
269
+ case KeyCode.Right: movePlayer(1, 0); break;
270
+ case KeyCode.Menu: togglePause(); break;
271
+ }
272
+ } else {
273
+ // 松开(up)— 用于停止移动、结束长按等
274
+ stopPlayer();
275
+ }
276
+ });
277
+ ```
278
+
279
+ ### API
280
+
281
+ | 方法 | 说明 |
282
+ |------|------|
283
+ | `AdSdk.onKeyEvent(handler)` | 监听按键事件,handler 接收 `{ key, action }` |
284
+ | `AdSdk.offKeyEvent(handler?)` | 取消监听,不传 handler 则清除所有 |
285
+
286
+ ### 回调数据
287
+
288
+ | 字段 | 类型 | 说明 |
289
+ |------|------|------|
290
+ | `e.key` | string | 按键名称,见下方映射表 |
291
+ | `e.action` | string | `"down"` = 按下,`"up"` = 松开 |
292
+
293
+ ### 按键映射
294
+
295
+ | 遥控器按键 | KeyCode | 实际值 | 说明 |
296
+ |-----------|---------|--------|------|
297
+ | ↑ 上 | `KeyCode.Up` | `'up'` | 方向键上 |
298
+ | ↓ 下 | `KeyCode.Down` | `'down'` | 方向键下 |
299
+ | ← 左 | `KeyCode.Left` | `'left'` | 方向键左 |
300
+ | → 右 | `KeyCode.Right` | `'right'` | 方向键右 |
301
+ | 确认 (OK) | `KeyCode.Enter` | `'enter'` | 中心确认键 |
302
+ | 返回 | `KeyCode.Back` | `'back'` | 返回键 |
303
+ | 菜单 | `KeyCode.Menu` | `'menu'` | 菜单键 |
304
+
305
+ ### 注意事项
306
+
307
+ - **同时推送 down 和 up**:按下触发 `action: 'down'`,松开触发 `action: 'up'`,可据此实现长按/连发
308
+ - **广告播放期间不推送**:广告播放中不会收到任何按键事件,无需自行屏蔽
309
+ - **返回键双击退出**:`back` 键的双击退出逻辑仍在 Native 侧处理,H5 仅收到按键事件通知,常用在页面返回/关闭逻辑
310
+ - **不要同时监听 keydown/keyup**:如果 H5 同时自行监听 `keydown/keyup`,可能收到重复事件,建议仅使用 `onKeyEvent`
311
+
312
+ ## 广告事件
313
+
314
+ | 事件 | 说明 | data |
315
+ |------|------|------|
316
+ | `AdEvent.Reward` | 观看完成,发放奖励 | `{ requestId, isCompleted }` |
317
+ | `AdEvent.Error` | 广告失败 | `{ code, message, requestId }` |
318
+ | `AdEvent.Closed` | 广告关闭 | `{ requestId }` |
319
+ | `AdEvent.Loaded` | 广告加载完成 | — |
320
+ | `AdEvent.Show` | 广告开始展示 | — |
321
+ | `AdEvent.Click` | 广告被点击 | — |
322
+
323
+ ## 错误码
324
+
325
+ ### 广告侧(1xxx)
326
+
327
+ | 码 | 常量 | 说明 |
328
+ |----|------|------|
329
+ | 1001 | `AdErrorCode.AdSwitchOff` | 广告开关关闭 |
330
+ | 1002 | `AdErrorCode.NoFill` | 无广告填充,素材池无可用广告 |
331
+ | 1003 | `AdErrorCode.Timeout` | 广告请求超时(5秒) |
332
+ | 1004 | `AdErrorCode.PlayFailed` | 视频播放失败 |
333
+ | 1005 | `AdErrorCode.NoFallbackAd` | 无兜底广告,兜底视频也未配置 |
334
+ | 1006 | `AdErrorCode.UserAbandoned` | 用户放弃观看,播放中途按返回键 |
335
+ | 1007 | `AdErrorCode.AdInProgress` | 广告播放中,不可重复请求 |
336
+
337
+ ### SDK 侧(2xxx)
338
+
339
+ | 码 | 常量 | 说明 |
340
+ |----|------|------|
341
+ | 0 | `AdErrorCode.Success` | 成功 |
342
+ | -1 | `AdErrorCode.Unknown` | 通用错误 |
343
+ | 2001 | `AdErrorCode.NotInitialized` | SDK 未初始化 |
344
+ | 2002 | `AdErrorCode.PlatformNotSupported` | 平台不支持 |