|
|
- /**
- * 激励视频广告混入
- * 提供激励视频广告的通用功能
- */
- 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()
- }
- }
|