jyj-components 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 +223 -69
- package/miniprogram_dist/ad-banner/index.js +170 -27
- package/miniprogram_dist/ad-banner/index.js.map +1 -1
- package/miniprogram_dist/ad-interstitial/index.js +172 -29
- package/miniprogram_dist/ad-interstitial/index.js.map +1 -1
- package/miniprogram_dist/ad-rewarded-video/index.js +168 -26
- package/miniprogram_dist/ad-rewarded-video/index.js.map +1 -1
- package/miniprogram_dist/ad-splash/index.js +304 -39
- package/miniprogram_dist/ad-splash/index.js.map +1 -1
- package/miniprogram_dist/ad-splash/index.wxml +1 -1
- package/miniprogram_dist/ad-splash/index.wxss +0 -1
- package/package.json +1 -1
- package/src/ad-banner/index.js +16 -2
- package/src/ad-interstitial/index.js +18 -4
- package/src/ad-rewarded-video/index.js +14 -1
- package/src/ad-splash/index.js +83 -3
- package/src/ad-splash/index.wxml +1 -1
- package/src/ad-splash/index.wxss +0 -1
- package/src/mixins/ad-base.js +152 -25
- package/miniprogram_dist/assets/copy.wxss +0 -3
- package/miniprogram_dist/assets/icon.png +0 -0
- package/miniprogram_dist/utils.js +0 -5
- package/src/assets/copy.wxss +0 -3
- package/src/assets/icon.png +0 -0
- package/src/common.wxss +0 -5
- package/src/index.js +0 -24
- package/src/index.json +0 -9
- package/src/index.wxml +0 -2
- package/src/index.wxss +0 -6
- package/src/lib.ts +0 -5
- package/src/reset.wxss +0 -3
- package/src/utils.js +0 -5
package/README.md
CHANGED
|
@@ -1,72 +1,128 @@
|
|
|
1
1
|
# 聚优甲广告组件库
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
微信小程序广告组件库,支持横幅广告、插屏广告、激励视频广告和开屏广告。
|
|
4
|
+
|
|
5
|
+
## 目录
|
|
6
|
+
|
|
7
|
+
- [安装](#安装)
|
|
8
|
+
- [添加合法域名](#添加合法域名)
|
|
9
|
+
- [组件使用](#组件使用)
|
|
10
|
+
- [横幅广告](#1-横幅广告-ad-banner)
|
|
11
|
+
- [插屏广告](#2-插屏广告-ad-interstitial)
|
|
12
|
+
- [激励视频广告](#3-激励视频广告-ad-rewarded-video)
|
|
13
|
+
- [开屏广告](#4-开屏广告-ad-splash)
|
|
14
|
+
- [注意事项](#注意事项)
|
|
15
|
+
- [常见问题](#常见问题)
|
|
4
16
|
|
|
5
17
|
## 安装
|
|
6
18
|
|
|
7
|
-
###
|
|
19
|
+
### npm 安装(推荐)
|
|
8
20
|
|
|
9
21
|
```bash
|
|
10
22
|
npm install jyj-components
|
|
11
23
|
```
|
|
12
24
|
|
|
13
|
-
|
|
25
|
+
#### 小程序原生项目配置
|
|
26
|
+
|
|
27
|
+
参考[小程序npm支持](https://developers.weixin.qq.com/miniprogram/dev/devtools/npm.html)
|
|
28
|
+
|
|
29
|
+
1. 小程序开发者工具 -> 详情(工具右上角) -> 本地设置 -> 使用npm模块
|
|
30
|
+
2. 小程序开发者工具 -> 工具 -> 构建 npm
|
|
31
|
+
3. 构建成功后小程序代码包中将产出 `miniprogram_npm` 文件夹
|
|
32
|
+
|
|
33
|
+
#### uni-app 框架配置
|
|
34
|
+
|
|
35
|
+
参考[小程序自定义组件支持](https://uniapp.dcloud.io/frame?id=%e5%b0%8f%e7%a8%8b%e5%ba%8f%e8%87%aa%e5%ae%9a%e4%b9%89%e7%bb%84%e4%bb%b6%e6%94%af%e6%8c%81)
|
|
36
|
+
|
|
37
|
+
1. 在根目录新建 `wxcomponents` 文件夹
|
|
38
|
+
2. 打开 `node_modules/jyj-components` 文件,**复制目录中整个 src 文件到 wxcomponents 目录下新建 jyj-components 文件夹**,按需重命名使用
|
|
14
39
|
|
|
15
|
-
```json
|
|
16
|
-
{
|
|
17
|
-
"usingComponents": {
|
|
18
|
-
"ad-banner": "jyj-components/ad-banner/index",
|
|
19
|
-
"ad-interstitial": "jyj-components/ad-interstitial/index",
|
|
20
|
-
"ad-rewarded-video": "jyj-components/ad-rewarded-video/index",
|
|
21
|
-
"ad-splash": "jyj-components/ad-splash/index"
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
```
|
|
25
40
|
|
|
26
|
-
### 方式二:本地引入
|
|
27
41
|
|
|
28
|
-
将 `miniprogram_dist` 目录复制到项目中,然后在 `app.json` 中配置相对路径。
|
|
29
42
|
|
|
30
43
|
## 添加合法域名
|
|
31
44
|
|
|
32
|
-
1. 小程序账号登录[微信公众平台](https://mp.weixin.qq.com/)
|
|
33
|
-
2. 开发
|
|
34
|
-
3. 在 `downloadFile合法域名`
|
|
45
|
+
1. 小程序账号登录 [微信公众平台](https://mp.weixin.qq.com/)
|
|
46
|
+
2. 开发 → 开发管理 → 开发设置 → 服务器域名
|
|
47
|
+
3. 在 `downloadFile合法域名` 中增加如下配置:
|
|
35
48
|
|
|
36
49
|
```
|
|
37
50
|
https://wxgo.cdn.adwke.com
|
|
38
51
|
```
|
|
39
52
|
|
|
40
|
-
4. 在request
|
|
53
|
+
4. 在 `request合法域名` 中增加:
|
|
41
54
|
|
|
42
55
|
```
|
|
43
|
-
https://wxgo.adwke.com
|
|
56
|
+
https://wxgo.adwke.com
|
|
44
57
|
```
|
|
45
58
|
|
|
46
59
|
## 组件使用
|
|
47
60
|
|
|
48
|
-
|
|
61
|
+
在使用广告的页面 json 配置文件中引入组件(按需配置):
|
|
49
62
|
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"usingComponents": {
|
|
66
|
+
"ad-banner": "jyj-components/ad-banner/index",
|
|
67
|
+
"ad-interstitial": "jyj-components/ad-interstitial/index",
|
|
68
|
+
"ad-rewarded-video": "jyj-components/ad-rewarded-video/index",
|
|
69
|
+
"ad-splash": "jyj-components/ad-splash/index"
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
```
|
|
50
73
|
|
|
74
|
+
### 1. 横幅广告 (ad-banner)
|
|
75
|
+
|
|
76
|
+
在页面 wxml 文件中使用:
|
|
51
77
|
|
|
52
78
|
```xml
|
|
53
79
|
<ad-banner
|
|
54
80
|
slotId="your-slot-id"
|
|
55
81
|
bind:adLoad="onAdLoad"
|
|
56
82
|
bind:adError="onAdError"
|
|
83
|
+
bind:adOpenMiniProgram="adOpenMiniProgram"
|
|
57
84
|
/>
|
|
58
85
|
```
|
|
59
86
|
|
|
60
|
-
|
|
61
|
-
|
|
87
|
+
**属性说明:**
|
|
88
|
+
|
|
89
|
+
| 属性 | 类型 | 必填 | 说明 |
|
|
90
|
+
|------|------|------|------|
|
|
91
|
+
| slotId | String | 是 | 广告位 ID |
|
|
92
|
+
|
|
93
|
+
**事件说明:**
|
|
94
|
+
|
|
95
|
+
| 事件名 | 说明 |
|
|
96
|
+
|--------|------|
|
|
97
|
+
| adLoad | 广告加载成功时触发 |
|
|
98
|
+
| adError | 广告加载失败时触发 |
|
|
99
|
+
| adOpenMiniProgram | 跳转小程序时触发 |
|
|
100
|
+
|
|
101
|
+
在页面 js 文件中实现广告相关的事件回调函数:
|
|
102
|
+
|
|
103
|
+
```javascript
|
|
104
|
+
Page({
|
|
105
|
+
adOpenMiniProgram(options) {
|
|
106
|
+
wx.openEmbeddedMiniProgram({
|
|
107
|
+
appId: options.detail.appId,
|
|
108
|
+
path: options.detail.path,
|
|
109
|
+
});
|
|
110
|
+
},
|
|
111
|
+
|
|
112
|
+
onAdLoad(options) {
|
|
113
|
+
console.log('广告加载成功');
|
|
114
|
+
},
|
|
115
|
+
|
|
116
|
+
onAdError(options) {
|
|
117
|
+
console.log('广告加载失败', options);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
```
|
|
62
121
|
|
|
63
|
-
**事件:**
|
|
64
|
-
- `adLoad`:广告加载成功
|
|
65
|
-
- `adError`:广告加载失败
|
|
66
|
-
- `adOpenMiniProgram`:跳转小程序(自定义广告)
|
|
67
122
|
|
|
68
123
|
### 2. 插屏广告 (ad-interstitial)
|
|
69
124
|
|
|
125
|
+
在页面 wxml 文件中使用:
|
|
70
126
|
|
|
71
127
|
```xml
|
|
72
128
|
<ad-interstitial
|
|
@@ -76,18 +132,28 @@ https://wxgo.adwke.com/
|
|
|
76
132
|
bind:adLoad="onAdLoad"
|
|
77
133
|
bind:adError="onAdError"
|
|
78
134
|
bind:adClose="onAdClose"
|
|
135
|
+
bind:adOpenMiniProgram="adOpenMiniProgram"
|
|
79
136
|
/>
|
|
80
137
|
```
|
|
81
138
|
|
|
82
|
-
|
|
83
|
-
- `slotId` (String, 必填):广告位 ID
|
|
84
|
-
- `isShow` (Boolean):控制广告显示
|
|
85
|
-
- `isDestroy` (Boolean):控制广告销毁 默认false 每个广告实例只能修改一次
|
|
139
|
+
**属性说明:**
|
|
86
140
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
-
|
|
90
|
-
|
|
141
|
+
| 属性 | 类型 | 必填 | 默认值 | 说明 |
|
|
142
|
+
|------|------|------|--------|------|
|
|
143
|
+
| slotId | String | 是 | - | 广告位 ID |
|
|
144
|
+
| isShow | Boolean | 否 | false | 控制广告显示,需要广告加载成功后设置为 true 时展示插屏广告 |
|
|
145
|
+
| isDestroy | Boolean | 否 | false | 控制广告销毁,每个广告实例只能修改一次 |
|
|
146
|
+
|
|
147
|
+
> **注意:** 小程序打开后至少 20 秒才可以展示插屏广告,与其他插屏/激励视频广告展示间隔也是一样。
|
|
148
|
+
|
|
149
|
+
**事件说明:**
|
|
150
|
+
|
|
151
|
+
| 事件名 | 说明 |
|
|
152
|
+
|--------|------|
|
|
153
|
+
| adLoad | 广告加载成功时触发 |
|
|
154
|
+
| adError | 广告加载失败时触发 |
|
|
155
|
+
| adClose | 广告关闭时触发 |
|
|
156
|
+
| adOpenMiniProgram | 跳转小程序时触发(自定义广告) |
|
|
91
157
|
|
|
92
158
|
**使用示例:**
|
|
93
159
|
|
|
@@ -98,22 +164,35 @@ Page({
|
|
|
98
164
|
destroyAd: false
|
|
99
165
|
},
|
|
100
166
|
|
|
167
|
+
adOpenMiniProgram(options) {
|
|
168
|
+
wx.openEmbeddedMiniProgram({
|
|
169
|
+
appId: options.detail.appId,
|
|
170
|
+
path: options.detail.path,
|
|
171
|
+
});
|
|
172
|
+
},
|
|
173
|
+
|
|
174
|
+
// 显示插屏广告
|
|
101
175
|
showInterstitialAd() {
|
|
102
176
|
this.setData({ showAd: true });
|
|
103
177
|
},
|
|
104
178
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
179
|
+
onAdLoad(e) {
|
|
180
|
+
console.log('广告加载成功');
|
|
181
|
+
},
|
|
182
|
+
|
|
183
|
+
onAdError(e) {
|
|
184
|
+
console.log('广告加载失败', e);
|
|
185
|
+
},
|
|
186
|
+
|
|
187
|
+
onAdClose(e) {
|
|
188
|
+
console.log('广告关闭');
|
|
110
189
|
}
|
|
111
190
|
});
|
|
112
191
|
```
|
|
113
192
|
|
|
114
193
|
### 3. 激励视频广告 (ad-rewarded-video)
|
|
115
194
|
|
|
116
|
-
|
|
195
|
+
在页面 wxml 文件中使用:
|
|
117
196
|
|
|
118
197
|
```xml
|
|
119
198
|
<ad-rewarded-video
|
|
@@ -127,90 +206,165 @@ Page({
|
|
|
127
206
|
/>
|
|
128
207
|
```
|
|
129
208
|
|
|
130
|
-
|
|
131
|
-
- `slotId` (String, 必填):广告位 ID
|
|
132
|
-
- `isShow` (Boolean):控制视频播放
|
|
133
|
-
- `isDestroy` (Boolean):控制广告销毁 默认false 每个广告实例只能修改一次
|
|
209
|
+
**属性说明:**
|
|
134
210
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
-
|
|
138
|
-
|
|
139
|
-
|
|
211
|
+
| 属性 | 类型 | 必填 | 默认值 | 说明 |
|
|
212
|
+
|------|------|------|--------|------|
|
|
213
|
+
| slotId | String | 是 | - | 广告位 ID |
|
|
214
|
+
| isShow | Boolean | 否 | false | 控制视频播放,当广告加载成功后设置为 true 时播放广告 |
|
|
215
|
+
| isDestroy | Boolean | 否 | false | 控制广告销毁,每个广告实例只能修改一次 |
|
|
216
|
+
|
|
217
|
+
**事件说明:**
|
|
218
|
+
|
|
219
|
+
| 事件名 | 说明 |
|
|
220
|
+
|--------|------|
|
|
221
|
+
| adLoad | 广告加载成功时触发 |
|
|
222
|
+
| adError | 广告加载失败时触发 |
|
|
223
|
+
| adClose | 广告关闭时触发 |
|
|
224
|
+
| adFinished | 视频播放完成时触发(用户获得奖励) |
|
|
140
225
|
|
|
141
226
|
**使用示例:**
|
|
142
227
|
|
|
143
228
|
```javascript
|
|
144
229
|
Page({
|
|
145
230
|
data: {
|
|
146
|
-
showVideo: false
|
|
231
|
+
showVideo: false,
|
|
232
|
+
destroyVideo: false
|
|
147
233
|
},
|
|
148
234
|
|
|
235
|
+
// 观看视频获取奖励
|
|
149
236
|
watchVideoForReward() {
|
|
150
237
|
this.setData({ showVideo: true });
|
|
151
238
|
},
|
|
152
239
|
|
|
240
|
+
onAdLoad(e) {
|
|
241
|
+
console.log('广告加载成功');
|
|
242
|
+
},
|
|
243
|
+
|
|
244
|
+
onAdError(e) {
|
|
245
|
+
console.log('广告加载失败', e);
|
|
246
|
+
},
|
|
247
|
+
|
|
248
|
+
onAdClose(e) {
|
|
249
|
+
console.log('广告关闭');
|
|
250
|
+
},
|
|
251
|
+
|
|
153
252
|
onAdFinished(e) {
|
|
154
253
|
if (e.detail.isEnded) {
|
|
155
254
|
// 用户看完视频,发放奖励
|
|
255
|
+
console.log('用户看完视频,可以发放奖励');
|
|
156
256
|
this.giveReward();
|
|
257
|
+
} else {
|
|
258
|
+
console.log('用户未看完视频');
|
|
157
259
|
}
|
|
260
|
+
},
|
|
261
|
+
|
|
262
|
+
giveReward() {
|
|
263
|
+
// 发放奖励的逻辑
|
|
264
|
+
wx.showToast({
|
|
265
|
+
title: '奖励已发放',
|
|
266
|
+
icon: 'success'
|
|
267
|
+
});
|
|
158
268
|
}
|
|
159
269
|
});
|
|
160
270
|
```
|
|
161
271
|
|
|
162
272
|
### 4. 开屏广告 (ad-splash)
|
|
163
273
|
|
|
274
|
+
在小程序首页页面中使用:
|
|
164
275
|
|
|
165
276
|
```xml
|
|
166
|
-
<
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
277
|
+
<block wx:if="{{showSplash}}">
|
|
278
|
+
<ad-splash
|
|
279
|
+
slotId="your-slot-id"
|
|
280
|
+
bind:adLoad="onAdLoad"
|
|
281
|
+
bind:adError="onAdError"
|
|
282
|
+
bind:adFinished="onAdFinished"
|
|
283
|
+
/>
|
|
284
|
+
</block>
|
|
172
285
|
```
|
|
173
286
|
|
|
174
|
-
|
|
175
|
-
|
|
287
|
+
**属性说明:**
|
|
288
|
+
|
|
289
|
+
| 属性 | 类型 | 必填 | 说明 |
|
|
290
|
+
|------|------|------|------|
|
|
291
|
+
| slotId | String | 是 | 广告位 ID |
|
|
176
292
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
293
|
+
**事件说明:**
|
|
294
|
+
|
|
295
|
+
| 事件名 | 说明 |
|
|
296
|
+
|--------|------|
|
|
297
|
+
| adLoad | 广告加载成功时触发 |
|
|
298
|
+
| adError | 广告加载失败时触发 |
|
|
299
|
+
| adFinished | 广告结束时触发(倒计时结束或用户跳过) |
|
|
181
300
|
|
|
182
301
|
**使用示例:**
|
|
183
302
|
|
|
184
303
|
```javascript
|
|
185
|
-
//
|
|
304
|
+
// 首页 index.js
|
|
186
305
|
Page({
|
|
306
|
+
data: {
|
|
307
|
+
showSplash: true
|
|
308
|
+
},
|
|
309
|
+
|
|
187
310
|
onLoad() {
|
|
188
311
|
// 开屏广告会自动展示
|
|
189
312
|
},
|
|
190
313
|
|
|
191
|
-
|
|
314
|
+
onAdLoad(e) {
|
|
315
|
+
console.log('开屏广告加载成功');
|
|
316
|
+
},
|
|
317
|
+
|
|
318
|
+
onAdError(e) {
|
|
319
|
+
console.log('开屏广告加载失败', e);
|
|
320
|
+
// 广告加载失败,直接进入主页面
|
|
321
|
+
this.setData({ showSplash: false });
|
|
322
|
+
},
|
|
323
|
+
|
|
324
|
+
onAdFinished(e) {
|
|
192
325
|
// 广告结束,进入主页面
|
|
193
326
|
console.log('开屏广告结束');
|
|
327
|
+
this.setData({ showSplash: false });
|
|
194
328
|
}
|
|
195
329
|
});
|
|
196
330
|
```
|
|
197
331
|
|
|
198
332
|
## 注意事项
|
|
199
333
|
|
|
200
|
-
1.
|
|
334
|
+
1. **授权配置**:向运营人员获取授权链接,通过授权链接授权权限
|
|
201
335
|
2. **广告位 ID**:需要向运营人员申请有效的 `slotId`
|
|
336
|
+
3. **展示时机**:插屏广告和激励视频广告需要在小程序打开至少 20 秒后才能展示
|
|
337
|
+
4. **广告间隔**:插屏广告、激励视频广告之间需要保持一定的展示间隔(至少 20 秒)
|
|
338
|
+
5. **合法域名**:务必在微信公众平台配置合法域名,否则广告无法正常加载
|
|
202
339
|
|
|
203
340
|
|
|
204
341
|
## 常见问题
|
|
205
342
|
|
|
206
343
|
### Q: 广告不显示?
|
|
207
|
-
|
|
344
|
+
|
|
345
|
+
**A:** 请按以下步骤排查:
|
|
346
|
+
1. 检查 `slotId` 是否正确
|
|
347
|
+
2. 确认已在微信公众平台配置合法域名
|
|
348
|
+
3. 检查网络请求是否成功(开发者工具 -> Network)
|
|
349
|
+
4. 确认广告数据格式是否正确
|
|
350
|
+
5. 检查是否已完成授权配置
|
|
208
351
|
|
|
209
352
|
### Q: 如何控制广告展示时机?
|
|
210
|
-
|
|
353
|
+
|
|
354
|
+
**A:**
|
|
355
|
+
- 横幅广告:组件加载后自动展示
|
|
356
|
+
- 插屏广告和激励视频:使用 `isShow` 属性控制展示时机,在广告加载成功后设置为 `true`
|
|
357
|
+
- 开屏广告:页面加载时自动展示
|
|
211
358
|
|
|
212
359
|
### Q: 如何销毁广告实例?
|
|
213
|
-
|
|
360
|
+
|
|
361
|
+
**A:** 设置 `isDestroy` 为 `true` 即可销毁广告实例,释放内存。注意每个广告实例只能销毁一次。
|
|
362
|
+
|
|
363
|
+
### Q: 插屏广告和激励视频为什么无法立即展示?
|
|
364
|
+
|
|
365
|
+
**A:** 根据微信小程序规范,插屏广告和激励视频广告需要在小程序打开至少 20 秒后才能展示,且两次广告展示之间需要间隔至少 20 秒。
|
|
366
|
+
|
|
367
|
+
|
|
214
368
|
|
|
215
369
|
|
|
216
370
|
|
|
@@ -98,53 +98,159 @@ var _require = __webpack_require__(1),
|
|
|
98
98
|
getAds = _require.getAds;
|
|
99
99
|
|
|
100
100
|
module.exports = {
|
|
101
|
-
|
|
101
|
+
// 检查并重置每日数据
|
|
102
|
+
checkAndResetDaily: function checkAndResetDaily() {
|
|
102
103
|
var slotId = this.properties.slotId;
|
|
103
104
|
var type = this.properties.type;
|
|
104
|
-
var
|
|
105
|
-
var adShowCountKey = 'adShowCount_' + slotId + '_' + type;
|
|
105
|
+
var dateKey = 'adDate_' + slotId + '_' + type;
|
|
106
106
|
|
|
107
|
-
var
|
|
108
|
-
var
|
|
107
|
+
var today = new Date().toDateString();
|
|
108
|
+
var savedDate = wx.getStorageSync(dateKey);
|
|
109
109
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
110
|
+
// 如果日期不同,重置所有数据
|
|
111
|
+
if (savedDate !== today) {
|
|
112
|
+
var customAdIndexKey = 'customAdIndex_' + slotId + '_' + type;
|
|
113
|
+
var customAdShowCountKey = 'customAdShowCount_' + slotId + '_' + type;
|
|
114
|
+
|
|
115
|
+
wx.setStorageSync(dateKey, today);
|
|
116
|
+
wx.setStorageSync(customAdIndexKey, 1); // 自有广告从索引1开始
|
|
117
|
+
wx.setStorageSync(customAdShowCountKey, 0);
|
|
118
|
+
|
|
119
|
+
return true; // 表示已重置
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return false; // 表示未重置
|
|
123
|
+
},
|
|
124
|
+
restoreAdState: function restoreAdState() {
|
|
125
|
+
// 检查并重置每日数据
|
|
126
|
+
this.checkAndResetDaily();
|
|
114
127
|
},
|
|
115
128
|
saveAdState: function saveAdState() {
|
|
116
129
|
var slotId = this.properties.slotId;
|
|
117
130
|
var type = this.properties.type;
|
|
118
|
-
var
|
|
119
|
-
var
|
|
131
|
+
var customAdIndexKey = 'customAdIndex_' + slotId + '_' + type;
|
|
132
|
+
var customAdShowCountKey = 'customAdShowCount_' + slotId + '_' + type;
|
|
133
|
+
|
|
134
|
+
// 只保存自有广告的状态(索引>0)
|
|
135
|
+
if (this.data.currentAdIndex > 0) {
|
|
136
|
+
wx.setStorageSync(customAdIndexKey, this.data.currentAdIndex);
|
|
137
|
+
wx.setStorageSync(customAdShowCountKey, this.data.currentAdShowCount);
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
// 检查微信广告是否失败(只在内存中,不持久化)
|
|
143
|
+
isWxAdFailed: function isWxAdFailed() {
|
|
144
|
+
return this.data.wxAdFailed || false;
|
|
145
|
+
},
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
// 标记微信广告失败(只在内存中,不持久化)
|
|
149
|
+
markWxAdFailed: function markWxAdFailed() {
|
|
150
|
+
this.setData({
|
|
151
|
+
wxAdFailed: true
|
|
152
|
+
});
|
|
153
|
+
},
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
// 检查所有自有广告是否都达到上限
|
|
157
|
+
isAllCustomAdsReachedLimit: function isAllCustomAdsReachedLimit() {
|
|
158
|
+
var ads = this.data.ads;
|
|
159
|
+
if (!ads || ads.length <= 1) return true; // 只有微信广告或没有广告
|
|
160
|
+
|
|
161
|
+
var currentIndex = this.data.currentAdIndex;
|
|
162
|
+
var showCount = this.data.currentAdShowCount;
|
|
163
|
+
|
|
164
|
+
// 如果当前不是自有广告,返回false
|
|
165
|
+
if (currentIndex === 0) return false;
|
|
166
|
+
|
|
167
|
+
// 找到最后一个有效的自有广告索引
|
|
168
|
+
var lastValidAdIndex = -1;
|
|
169
|
+
for (var i = ads.length - 1; i >= 1; i--) {
|
|
170
|
+
if (ads[i][this.properties.type] !== undefined) {
|
|
171
|
+
lastValidAdIndex = i;
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// 如果没有有效的自有广告,返回true
|
|
177
|
+
if (lastValidAdIndex === -1) return true;
|
|
178
|
+
|
|
179
|
+
// 如果当前索引已经是最后一个有效广告,且达到展示上限,返回true
|
|
180
|
+
if (currentIndex === lastValidAdIndex) {
|
|
181
|
+
var ad = ads[currentIndex];
|
|
182
|
+
var maxShowCount = ad.showCount || 1;
|
|
183
|
+
return showCount >= maxShowCount;
|
|
184
|
+
}
|
|
120
185
|
|
|
121
|
-
|
|
122
|
-
wx.setStorageSync(adShowCountKey, this.data.currentAdShowCount);
|
|
186
|
+
return false;
|
|
123
187
|
},
|
|
124
188
|
loadNextAd: function loadNextAd() {
|
|
125
189
|
var ads = this.data.ads;
|
|
126
190
|
if (!ads || ads.length === 0) return;
|
|
127
191
|
|
|
192
|
+
// 检查并重置每日数据
|
|
193
|
+
this.checkAndResetDaily();
|
|
194
|
+
|
|
128
195
|
var currentIndex = this.data.currentAdIndex;
|
|
129
196
|
var showCount = this.data.currentAdShowCount;
|
|
130
197
|
|
|
131
|
-
|
|
198
|
+
// 如果是微信广告(索引0)且未失败,直接加载微信广告
|
|
199
|
+
if (currentIndex === 0 && !this.isWxAdFailed()) {
|
|
200
|
+
var wxAd = ads[0];
|
|
201
|
+
if (wxAd && wxAd[this.properties.type] !== undefined) {
|
|
202
|
+
this.setData({ currentAd: wxAd });
|
|
203
|
+
return;
|
|
204
|
+
} else {
|
|
205
|
+
// 微信广告没有配置,标记为失败,切换到自有广告
|
|
206
|
+
this.markWxAdFailed();
|
|
207
|
+
currentIndex = 1;
|
|
208
|
+
showCount = 0;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// 如果微信广告失败,从自有广告开始
|
|
213
|
+
if (currentIndex === 0 && this.isWxAdFailed()) {
|
|
214
|
+
// 从存储中恢复自有广告的状态
|
|
215
|
+
var slotId = this.properties.slotId;
|
|
216
|
+
var type = this.properties.type;
|
|
217
|
+
var customAdIndexKey = 'customAdIndex_' + slotId + '_' + type;
|
|
218
|
+
var customAdShowCountKey = 'customAdShowCount_' + slotId + '_' + type;
|
|
219
|
+
|
|
220
|
+
currentIndex = wx.getStorageSync(customAdIndexKey) || 1;
|
|
221
|
+
showCount = wx.getStorageSync(customAdShowCountKey) || 0;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// 如果没有自有广告,不展示任何广告
|
|
225
|
+
if (ads.length <= 1) {
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
132
228
|
|
|
133
|
-
|
|
229
|
+
// 检查所有自有广告是否都达到上限
|
|
230
|
+
if (this.isAllCustomAdsReachedLimit()) {
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// 处理自有广告的展示次数限制
|
|
235
|
+
var ad = ads[currentIndex];
|
|
236
|
+
var maxShowCount = ad.showCount || 1;
|
|
237
|
+
|
|
238
|
+
// 如果当前自有广告达到展示上限,切换到下一个
|
|
134
239
|
if (showCount >= maxShowCount) {
|
|
135
240
|
currentIndex = currentIndex + 1;
|
|
136
241
|
showCount = 0;
|
|
137
|
-
this.setData({
|
|
138
|
-
currentAdIndex: currentIndex,
|
|
139
|
-
currentAdShowCount: showCount
|
|
140
|
-
});
|
|
141
|
-
this.saveAdState();
|
|
142
|
-
}
|
|
143
242
|
|
|
144
|
-
|
|
145
|
-
|
|
243
|
+
// 如果超出广告列表范围,说明所有广告都达到上限
|
|
244
|
+
if (currentIndex >= ads.length) {
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
ad = ads[currentIndex];
|
|
249
|
+
}
|
|
146
250
|
|
|
251
|
+
// 检查当前广告是否有配置
|
|
147
252
|
if (ad[this.properties.type] === undefined) {
|
|
253
|
+
// 没有配置,跳过并尝试下一个
|
|
148
254
|
this.setData({
|
|
149
255
|
currentAdIndex: currentIndex + 1,
|
|
150
256
|
currentAdShowCount: 0
|
|
@@ -154,8 +260,11 @@ module.exports = {
|
|
|
154
260
|
return;
|
|
155
261
|
}
|
|
156
262
|
|
|
263
|
+
// 设置当前广告
|
|
157
264
|
this.setData({
|
|
158
|
-
|
|
265
|
+
currentAd: ad,
|
|
266
|
+
currentAdIndex: currentIndex,
|
|
267
|
+
currentAdShowCount: showCount
|
|
159
268
|
});
|
|
160
269
|
this.saveAdState();
|
|
161
270
|
},
|
|
@@ -179,8 +288,22 @@ module.exports = {
|
|
|
179
288
|
this.triggerEvent('adLoad', e.detail || {});
|
|
180
289
|
}
|
|
181
290
|
this.report('load');
|
|
291
|
+
|
|
292
|
+
// 只有自有广告(索引>0)才增加展示计数
|
|
293
|
+
if (this.data.currentAdIndex > 0) {
|
|
294
|
+
var showCount = this.data.currentAdShowCount;
|
|
295
|
+
this.setData({
|
|
296
|
+
currentAdShowCount: showCount + 1
|
|
297
|
+
});
|
|
298
|
+
this.saveAdState();
|
|
299
|
+
}
|
|
182
300
|
},
|
|
183
301
|
adError: function adError(e) {
|
|
302
|
+
// 如果是微信广告(索引0)失败,标记为失败状态
|
|
303
|
+
if (this.data.currentAdIndex === 0) {
|
|
304
|
+
this.markWxAdFailed();
|
|
305
|
+
}
|
|
306
|
+
|
|
184
307
|
if (e === 'undefined') {
|
|
185
308
|
this.triggerEvent('adError', { msg: 'ad adError' });
|
|
186
309
|
} else {
|
|
@@ -222,7 +345,13 @@ module.exports = {
|
|
|
222
345
|
ads = _context.sent;
|
|
223
346
|
|
|
224
347
|
this.setData({ ads: ads });
|
|
225
|
-
|
|
348
|
+
|
|
349
|
+
// 每次初始化时,总是从微信广告开始(索引0)
|
|
350
|
+
this.setData({
|
|
351
|
+
currentAdIndex: 0,
|
|
352
|
+
currentAdShowCount: 0
|
|
353
|
+
});
|
|
354
|
+
|
|
226
355
|
this.loadNextAd();
|
|
227
356
|
|
|
228
357
|
case 7:
|
|
@@ -312,7 +441,8 @@ Component({
|
|
|
312
441
|
ads: [],
|
|
313
442
|
currentAd: {},
|
|
314
443
|
currentAdIndex: 0,
|
|
315
|
-
currentAdShowCount: 0
|
|
444
|
+
currentAdShowCount: 0,
|
|
445
|
+
wxAdFailed: false // 微信广告失败标记(仅内存,不持久化)
|
|
316
446
|
},
|
|
317
447
|
lifetimes: {
|
|
318
448
|
attached: function () {
|
|
@@ -340,6 +470,18 @@ Component({
|
|
|
340
470
|
}()
|
|
341
471
|
},
|
|
342
472
|
methods: {
|
|
473
|
+
checkAndResetDaily: function checkAndResetDaily() {
|
|
474
|
+
return adBase.checkAndResetDaily.call(this);
|
|
475
|
+
},
|
|
476
|
+
isWxAdFailed: function isWxAdFailed() {
|
|
477
|
+
return adBase.isWxAdFailed.call(this);
|
|
478
|
+
},
|
|
479
|
+
markWxAdFailed: function markWxAdFailed() {
|
|
480
|
+
adBase.markWxAdFailed.call(this);
|
|
481
|
+
},
|
|
482
|
+
isAllCustomAdsReachedLimit: function isAllCustomAdsReachedLimit() {
|
|
483
|
+
return adBase.isAllCustomAdsReachedLimit.call(this);
|
|
484
|
+
},
|
|
343
485
|
restoreAdState: function restoreAdState() {
|
|
344
486
|
adBase.restoreAdState.call(this);
|
|
345
487
|
},
|
|
@@ -356,7 +498,8 @@ Component({
|
|
|
356
498
|
adBase.adLoad.call(this, e);
|
|
357
499
|
},
|
|
358
500
|
adError: function adError(e) {
|
|
359
|
-
adBase.adError.call(this, e);
|
|
501
|
+
adBase.adError.call(this, e); // 先标记失败
|
|
502
|
+
this.loadNextAd(); // 再切换广告
|
|
360
503
|
},
|
|
361
504
|
adOpenMiniProgram: function adOpenMiniProgram() {
|
|
362
505
|
adBase.adOpenMiniProgram.call(this);
|