如何检测应用中广告触发的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
相关产品推荐
相关产品推荐

