# 激励视频广告

激励视频广告是一种全屏视频广告,用户可以选择观看完整的广告以换取应用内奖励。这种广告形式在游戏中非常流行,通常用于给玩家提供额外生命、虚拟货币或其他游戏内奖励。

开发者可以调用 tap.createRewardedVideoAd 创建激励视频广告组件。

# 一、创建激励视频广告

激励视频广告组件默认是隐藏的,开发者需要调用 RewardedVideoAd.show() 进行显示。

let rewardedVideoAd = tap.createRewardedVideoAd({
  adUnitId: 'xxxx'
})

rewardedVideoAd.show()

激励视频广告组件是一个单例组件,即整个小游戏生命周期内只会存在一个激励视频广告组件。通过多次调用 tap.createRewardedVideoAd 创建的激励视频广告组件会返回同一个实例。

# 二、显示/隐藏

激励视频广告组件需要调用 RewardedVideoAd.show() 进行显示。

rewardedVideoAd.show()

只有在用户点击关闭按钮或视频播放完毕时,广告才会关闭。开发者不能主动隐藏或关闭激励视频广告。

# 三、广告拉取成功与失败

激励视频广告组件在创建后会自动拉取广告素材,如果拉取成功,RewardedVideoAd.onLoad() 注册的回调函数会执行。

rewardedVideoAd.onLoad(() => {
  console.log('激励视频广告加载成功')
})

如果拉取失败,通过 RewardedVideoAd.onError() 注册的回调函数会执行,回调函数的参数是一个包含错误信息的对象。

rewardedVideoAd.onError(err => {
  console.log(err)
})

RewardedVideoAd.show() 返回一个 Promise,如果调用时广告素材尚未加载完成,则会返回 rejected Promise。建议在调用 show 之前先判断广告是否加载完成。

rewardedVideoAd.show()
  .then(() => console.log('激励视频广告显示成功'))
  .catch(err => {
    console.log('激励视频广告显示失败', err)
    // 可以尝试重新加载
    rewardedVideoAd.load()
      .then(() => rewardedVideoAd.show())
  })

# 四、监听用户关闭广告

用户可以在视频播放途中或播放完毕后关闭激励视频广告。开发者需要通过 RewardedVideoAd.onClose() 来监听用户关闭广告的行为,并根据 isEnded 参数来判断用户是否完整观看了视频。

rewardedVideoAd.onClose(res => {
  if (res && res.isEnded) {
    // 用户完整观看了视频,可以发放奖励
    console.log('用户完整观看了视频')
  } else {
    // 用户中途关闭了视频,不发放奖励
    console.log('用户中途关闭了视频')
  }
})

重要:只有当 isEndedtrue 时,才应该发放奖励给用户。

# 五、重新加载广告

在用户观看完或关闭广告后,广告素材会被清空,并自动加载下一份。

# 六、完整示例

// 创建激励视频广告实例
const rewardedVideoAd = tap.createRewardedVideoAd({
  adUnitId: 'your-ad-unit-id'
})

// 监听广告加载成功
rewardedVideoAd.onLoad(() => {
  console.log('激励视频广告加载成功,可以播放')
})

// 监听广告加载失败
rewardedVideoAd.onError(err => {
  console.log('激励视频广告加载失败', err)
})

// 监听广告关闭
rewardedVideoAd.onClose(res => {
  if (res && res.isEnded) {
    // 用户完整观看视频,发放奖励
    giveRewardToUser()
  } else {
    // 用户提前关闭,提示未获得奖励
    tap.showToast({
      title: '观看完整视频才能获得奖励哦',
      icon: 'none'
    })
  }
})

// 播放激励视频广告的函数
function showRewardedVideoAd() {
  rewardedVideoAd.show()
    .catch(err => {
      // 广告未加载完成,尝试加载后再播放
      rewardedVideoAd.load()
        .then(() => rewardedVideoAd.show())
        .catch(err => {
          tap.showToast({
            title: '暂无广告,请稍后再试',
            icon: 'none'
          })
        })
    })
}

// 发放奖励的函数
function giveRewardToUser() {
  // 这里实现发放奖励的逻辑
  tap.showToast({
    title: '恭喜获得奖励!',
    icon: 'success'
  })
}