/**
|
|
* 激励视频广告混入
|
|
* 提供激励视频广告的通用功能
|
|
*/
|
|
export default {
|
|
data() {
|
|
return {
|
|
// 视频广告相关
|
|
rewardedVideoAd: null, // 激励视频广告实例
|
|
isAdLoaded: false, // 广告是否已加载
|
|
isWatchingAd: false, // 是否正在观看广告
|
|
adUnitId: 'adunit-3b232fe9e10e8744' // 广告位ID,需要替换为实际的广告位ID
|
|
}
|
|
},
|
|
|
|
mounted() {
|
|
this.initRewardedVideoAd()
|
|
},
|
|
|
|
methods: {
|
|
/**
|
|
* 初始化激励视频广告
|
|
*/
|
|
initRewardedVideoAd() {
|
|
// #ifdef MP-WEIXIN
|
|
if (wx.createRewardedVideoAd) {
|
|
this.rewardedVideoAd = wx.createRewardedVideoAd({
|
|
adUnitId: this.adUnitId
|
|
})
|
|
|
|
// 监听广告加载成功
|
|
this.rewardedVideoAd.onLoad(() => {
|
|
console.log('激励视频广告加载成功')
|
|
this.isAdLoaded = true
|
|
// 调用子组件的回调方法(如果存在)
|
|
if (this.onAdLoaded && typeof this.onAdLoaded === 'function') {
|
|
this.onAdLoaded()
|
|
}
|
|
})
|
|
|
|
// 监听广告加载失败
|
|
this.rewardedVideoAd.onError((err) => {
|
|
console.log('激励视频广告加载失败', err)
|
|
this.isAdLoaded = false
|
|
// 调用子组件的回调方法(如果存在)
|
|
if (this.onAdError && typeof this.onAdError === 'function') {
|
|
this.onAdError(err)
|
|
}
|
|
})
|
|
|
|
// 监听广告关闭
|
|
this.rewardedVideoAd.onClose((res) => {
|
|
this.isWatchingAd = false
|
|
if (res && res.isEnded) {
|
|
// 用户看完了广告
|
|
console.log('用户看完广告')
|
|
// 调用临时回调方法或组件中定义的方法
|
|
if (this.tempOnAdWatchComplete && typeof this.tempOnAdWatchComplete === 'function') {
|
|
this.tempOnAdWatchComplete()
|
|
} else if (this.onAdWatchComplete && typeof this.onAdWatchComplete === 'function') {
|
|
this.onAdWatchComplete()
|
|
}
|
|
} else {
|
|
// 用户中途关闭了广告
|
|
console.log('用户中途关闭广告')
|
|
// 调用临时回调方法或组件中定义的方法
|
|
if (this.tempOnAdWatchCancel && typeof this.tempOnAdWatchCancel === 'function') {
|
|
this.tempOnAdWatchCancel()
|
|
} else if (this.onAdWatchCancel && typeof this.onAdWatchCancel === 'function') {
|
|
this.onAdWatchCancel()
|
|
} else {
|
|
// 默认提示
|
|
uni.showToast({
|
|
title: '请观看完整广告',
|
|
icon: 'none'
|
|
})
|
|
}
|
|
}
|
|
|
|
// 清理临时回调方法
|
|
this.tempOnAdWatchComplete = null
|
|
this.tempOnAdWatchCancel = null
|
|
this.tempOnAdError = null
|
|
})
|
|
|
|
// 预加载广告
|
|
this.rewardedVideoAd.load()
|
|
} else {
|
|
console.log('当前环境不支持激励视频广告')
|
|
}
|
|
// #endif
|
|
},
|
|
|
|
/**
|
|
* 显示激励视频广告
|
|
* @param {Object} options 配置选项
|
|
* @param {Function} options.onSuccess 观看完成后的回调
|
|
* @param {Function} options.onCancel 取消观看的回调
|
|
* @param {Function} options.onError 广告加载失败的回调
|
|
* @param {String} options.fallbackTitle 广告加载失败时的弹窗标题
|
|
* @param {String} options.fallbackContent 广告加载失败时的弹窗内容
|
|
*/
|
|
showRewardedVideoAd(options = {}) {
|
|
// 如果正在观看广告,直接返回
|
|
if (this.isWatchingAd) {
|
|
return
|
|
}
|
|
|
|
// 保存当前的回调方法,避免覆盖组件中已定义的方法
|
|
const originalOnAdWatchComplete = this.onAdWatchComplete
|
|
const originalOnAdWatchCancel = this.onAdWatchCancel
|
|
const originalOnAdError = this.onAdError
|
|
|
|
// 临时设置回调方法
|
|
if (options.onSuccess) {
|
|
this.tempOnAdWatchComplete = options.onSuccess
|
|
}
|
|
if (options.onCancel) {
|
|
this.tempOnAdWatchCancel = options.onCancel
|
|
}
|
|
if (options.onError) {
|
|
this.tempOnAdError = options.onError
|
|
}
|
|
|
|
// #ifdef MP-WEIXIN
|
|
if (this.rewardedVideoAd) {
|
|
this.isWatchingAd = true
|
|
this.rewardedVideoAd.show().catch(() => {
|
|
// 广告显示失败,重新加载
|
|
this.rewardedVideoAd.load().then(() => {
|
|
return this.rewardedVideoAd.show()
|
|
}).catch((err) => {
|
|
console.log('激励视频广告显示失败', err)
|
|
this.isWatchingAd = false
|
|
|
|
// 显示失败处理
|
|
const title = options.fallbackTitle || '广告加载失败'
|
|
const content = options.fallbackContent || '无法加载广告,是否继续操作?'
|
|
|
|
uni.showModal({
|
|
title: title,
|
|
content: content,
|
|
success: (res) => {
|
|
if (res.confirm) {
|
|
// 用户确认继续,调用成功回调
|
|
if (this.tempOnAdWatchComplete && typeof this.tempOnAdWatchComplete === 'function') {
|
|
this.tempOnAdWatchComplete()
|
|
} else if (originalOnAdWatchComplete && typeof originalOnAdWatchComplete === 'function') {
|
|
originalOnAdWatchComplete.call(this)
|
|
}
|
|
}
|
|
// 恢复原始回调方法
|
|
this.onAdWatchComplete = originalOnAdWatchComplete
|
|
this.onAdWatchCancel = originalOnAdWatchCancel
|
|
this.onAdError = originalOnAdError
|
|
}
|
|
})
|
|
})
|
|
})
|
|
} else {
|
|
// 没有广告实例,直接调用成功回调
|
|
if (this.tempOnAdWatchComplete && typeof this.tempOnAdWatchComplete === 'function') {
|
|
this.tempOnAdWatchComplete()
|
|
} else if (originalOnAdWatchComplete && typeof originalOnAdWatchComplete === 'function') {
|
|
originalOnAdWatchComplete.call(this)
|
|
}
|
|
// 恢复原始回调方法
|
|
this.onAdWatchComplete = originalOnAdWatchComplete
|
|
this.onAdWatchCancel = originalOnAdWatchCancel
|
|
this.onAdError = originalOnAdError
|
|
}
|
|
// #endif
|
|
|
|
// #ifndef MP-WEIXIN
|
|
// 非微信小程序环境,直接调用成功回调
|
|
if (this.tempOnAdWatchComplete && typeof this.tempOnAdWatchComplete === 'function') {
|
|
this.tempOnAdWatchComplete()
|
|
} else if (originalOnAdWatchComplete && typeof originalOnAdWatchComplete === 'function') {
|
|
originalOnAdWatchComplete.call(this)
|
|
}
|
|
// 恢复原始回调方法
|
|
this.onAdWatchComplete = originalOnAdWatchComplete
|
|
this.onAdWatchCancel = originalOnAdWatchCancel
|
|
this.onAdError = originalOnAdError
|
|
// #endif
|
|
},
|
|
|
|
/**
|
|
* 重新加载广告
|
|
*/
|
|
reloadAd() {
|
|
// #ifdef MP-WEIXIN
|
|
if (this.rewardedVideoAd) {
|
|
this.rewardedVideoAd.load()
|
|
}
|
|
// #endif
|
|
},
|
|
|
|
/**
|
|
* 销毁广告实例
|
|
*/
|
|
destroyAd() {
|
|
// #ifdef MP-WEIXIN
|
|
if (this.rewardedVideoAd) {
|
|
this.rewardedVideoAd.destroy()
|
|
this.rewardedVideoAd = null
|
|
}
|
|
// #endif
|
|
}
|
|
},
|
|
|
|
// 组件销毁时清理广告实例
|
|
beforeDestroy() {
|
|
this.destroyAd()
|
|
},
|
|
|
|
// uni-app 生命周期
|
|
onUnload() {
|
|
this.destroyAd()
|
|
}
|
|
}
|