# 插屏广告

插屏广告是一种在游戏自然间隙或过渡点展示的全屏或半屏广告。与激励视频广告不同,插屏广告不需要用户主动选择观看,通常在关卡切换、游戏暂停等场景出现。

开发者可以调用 tap.createInterstitialAd 创建插屏广告组件。

# 一、创建插屏广告

let interstitialAd = tap.createInterstitialAd({
  adUnitId: 'xxxx'
})

插屏广告组件在创建后会自动拉取广告素材。

# 二、显示/隐藏

插屏广告组件默认是隐藏的,需要调用 InterstitialAd.show() 进行显示。

interstitialAd.show()

用户可以主动关闭插屏广告。开发者不能主动隐藏插屏广告。

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

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

interstitialAd.onLoad(() => {
  console.log('插屏广告加载成功')
})

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

interstitialAd.onError(err => {
  console.log('插屏广告加载失败', err)
})

InterstitialAd.show() 返回一个 Promise,如果调用时广告素材尚未加载完成或加载失败,则会返回 rejected Promise。

interstitialAd.show()
  .then(() => console.log('插屏广告显示成功'))
  .catch(err => console.log('插屏广告显示失败', err))

# 四、监听用户关闭广告

用户关闭插屏广告后,开发者可以通过 InterstitialAd.onClose() 来监听这个事件。

interstitialAd.onClose(() => {
  console.log('用户关闭了插屏广告')
  // 继续游戏流程
})

# 五、重新加载广告

在用户关闭广告后,广告素材会被清空。并自动加载下一次的广告素材。

# 六、销毁广告

如果不再需要使用某个插屏广告实例,可以调用 destroy() 方法销毁它,以释放资源。

interstitialAd.destroy()

# 七、最佳实践

# 选择合适的展示时机

插屏广告应在自然的游戏间隙展示,避免打断用户的游戏体验:

  • ✅ 关卡结束时
  • ✅ 游戏暂停/恢复时
  • ✅ 页面/场景切换时
  • ❌ 游戏进行中突然弹出
  • ❌ 用户正在操作时

# 控制展示频率

过于频繁的插屏广告会影响用户体验,建议:

  • 设置展示间隔(如每 3 分钟最多展示 1 次)
  • 限制单次游戏会话中的最大展示次数

# 完整示例

// 创建插屏广告实例
const interstitialAd = tap.createInterstitialAd({
  adUnitId: 'your-ad-unit-id'
})

// 记录上次展示时间
let lastShowTime = 0
const MIN_INTERVAL = 180000 // 3分钟

// 监听广告加载成功
interstitialAd.onLoad(() => {
  console.log('插屏广告加载成功')
})

// 监听广告加载失败
interstitialAd.onError(err => {
  console.log('插屏广告加载失败', err)
})

// 监听广告关闭
interstitialAd.onClose(() => {
  console.log('用户关闭了插屏广告')
  // 继续游戏
  resumeGame()
})

// 展示插屏广告的函数(带频率控制)
function showInterstitialAd() {
  const now = Date.now()
  
  // 检查是否满足展示间隔
  if (now - lastShowTime < MIN_INTERVAL) {
    console.log('展示间隔未到,跳过本次广告')
    return
  }
  
  interstitialAd.show()
    .then(() => {
      lastShowTime = now
      console.log('插屏广告展示成功')
    })
    .catch(err => {
      console.log('插屏广告展示失败', err)
      // 展示失败,继续游戏流程
      resumeGame()
    })
}

// 在关卡结束时展示插屏广告
function onLevelComplete() {
  // 先暂停游戏
  pauseGame()
  // 展示插屏广告
  showInterstitialAd()
}

function pauseGame() {
  // 暂停游戏逻辑
}

function resumeGame() {
  // 恢复游戏逻辑
}