You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测应用中广告触发的Storekit弹窗/Overlay?

生产环境检测广告触发StoreKit弹窗/Overlay的可行方案

一、核心检测思路

1. 基于StoreKit原生回调的检测

针对不同StoreKit组件,结合标记区分广告触发场景:

  • SKStoreProductViewController(传统弹窗):实现SKStoreProductViewControllerDelegate的productViewControllerDidFinish:方法。广告展示前设置布尔标记(如isAdTriggeredStoreKit),弹窗关闭时若标记为true,则判定为广告触发的弹窗,统计频次后重置标记。
  • SKOverlay(iOS 15+悬浮层):实现SKOverlayDelegate的overlayDidDismiss:方法。展示Overlay时通过configuration.userInfo传入广告标识(如["isAdTriggered": true]),回调中读取该标识确认来源,完成统计。

2. 利用Vungle广告平台的专属回调

根据Vungle转化体验相关逻辑,广告触发StoreKit转化时会提供专属生命周期回调:

  • 监听conversionExperienceDidStart事件:广告触发StoreKit弹窗/Overlay时触发,可直接在此处统计触发频次。
  • 监听conversionExperienceDidFinish事件:转化体验结束时触发,可选统计转化结果(如是否完成购买)。
    这种方式无需自行区分来源,准确性更高,平台已帮你标记了广告触发的转化场景。

二、代码实现示例

基于Vungle回调的统计(推荐)

// 实现Vungle广告代理方法
extension YourAdManager: VungleAdDelegate {
    func conversionExperienceDidStart(for ad: VungleAd) {
        // 上报广告触发StoreKit转化事件
        AnalyticsService.shared.trackEvent("ad_triggered_storekit", parameters: [
            "ad_placement": ad.placementID,
            "ad_type": ad.adType.rawValue
        ])
    }

    func conversionExperienceDidFinish(for ad: VungleAd, with result: VungleConversionExperienceResult) {
        // 可选:上报转化结束事件及结果
        AnalyticsService.shared.trackEvent("ad_storekit_conversion_ended", parameters: [
            "result": result.rawValue,
            "ad_placement": ad.placementID
        ])
    }
}

基于StoreKit原生回调的统计

// 广告展示前设置标记
private var isAdTriggeredStoreKit = false

func showVungleAd() {
    let ad = VungleAd(placementID: "your_placement_id")
    ad.delegate = self
    ad.load { [weak self] success, error in
        guard success else { return }
        // 广告即将展示时标记
        self?.isAdTriggeredStoreKit = true
        ad.show(from: self?.viewController)
    }
}

// SKStoreProductViewController代理
extension YourViewController: SKStoreProductViewControllerDelegate {
    func productViewControllerDidFinish(_ viewController: SKStoreProductViewController) {
        guard isAdTriggeredStoreKit else { return }
        // 统计广告触发弹窗事件
        AnalyticsService.shared.trackEvent("ad_triggered_storekit_popup")
        isAdTriggeredStoreKit = false
    }
}

// SKOverlay代理
extension YourViewController: SKOverlayDelegate {
    func overlayDidDismiss(_ overlay: SKOverlay) {
        guard let isAdTriggered = overlay.userInfo?["isAdTriggered"] as? Bool, isAdTriggered else { return }
        // 统计广告触发Overlay事件
        AnalyticsService.shared.trackEvent("ad_triggered_storekit_overlay")
    }

    // 展示Overlay时传入标识
    func presentSKOverlayForAd() {
        let config = SKOverlayConfiguration(appIdentifier: "target_app_id")
        config.userInfo = ["isAdTriggered": true]
        let overlay = SKOverlay(configuration: config)
        overlay.delegate = self
        overlay.present()
    }
}

三、生产环境注意事项

  • 线程安全:标记变量建议用原子属性(如@Atomic var isAdTriggeredStoreKit = false)或加锁处理,避免广告回调与StoreKit回调在不同线程操作导致的统计误差。
  • 数据上报:统计事件需上报至自有后台或第三方统计平台(如Firebase、Amplitude),确保数据持久化可追溯。
  • 兼容性测试:覆盖iOS 14及以下(仅弹窗)、iOS 15+(弹窗+Overlay)的系统版本,以及不同类型的Vungle广告(插屏、激励视频等),验证回调稳定性。

内容的提问来源于stack exchange,提问作者Indus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 18:30:07