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

求KMP项目中iOS侧集成Google AdMob的实现教程与指引

KMP项目iOS端集成Google AdMob实现指引

1. 配置iOS端依赖

  • 打开iosApp目录下的Podfile,添加AdMob依赖:
    pod 'Google-Mobile-Ads-SDK'
    
  • 在终端执行pod install,之后使用.xcworkspace文件打开iOS项目。

2. 共享层接口定义(commonMain)

先在共享模块定义统一的广告操作接口,确保Android和iOS实现对齐:

interface AdMobManager {
    fun initialize(appId: String)
    fun loadBannerAd(adUnitId: String)
    fun showBannerAd()
    // 根据需求添加插屏、激励视频等广告方法
}

// 全局管理器,用于在iOS端传递实现实例
object SharedAdMobProvider {
    lateinit var adMobManager: AdMobManager
}

3. iOS端具体实现(iosMain)

通过Kotlin/Native调用AdMob的iOS SDK,实现共享接口:

import platform.GoogleMobileAds.GADMobileAds
import platform.GoogleMobileAds.GADBannerView
import platform.GoogleMobileAds.GADRequest
import platform.UIKit.CGRectMake
import platform.UIKit.UIWindow

class IosAdMobManager(private val window: UIWindow) : AdMobManager {
    private var bannerView: GADBannerView? = null

    override fun initialize(appId: String) {
        GADMobileAds.sharedInstance().startWithCompletionHandler(null)
    }

    override fun loadBannerAd(adUnitId: String) {
        bannerView = GADBannerView().apply {
            this.adUnitID = adUnitId
            rootViewController = window.rootViewController
            loadRequest(GADRequest())
            // 广告加载完成后自动展示
            setAdLoadedBlock {
                showBannerAd()
            }
        }
    }

    override fun showBannerAd() {
        bannerView?.let { view ->
            // 将Banner放置在屏幕底部
            view.frame = CGRectMake(
                0.0,
                window.bounds.size.height - view.bounds.size.height,
                window.bounds.size.width,
                view.bounds.size.height
            )
            window.addSubview(view)
        }
    }
}

4. iOS应用层桥接(iosApp)

在iOS原生代码中初始化AdMob,并将实现实例传递给共享层:

import UIKit
import GoogleMobileAds
import shared // 替换为你的KMP共享模块名称

class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        guard let window = window else { return true }
        
        // 初始化iOS端AdMob管理器并传递给共享层
        let iosAdMobManager = IosAdMobManager(window: window)
        SharedAdMobProvider.adMobManager = iosAdMobManager
        
        // 初始化AdMob(使用你的App ID)
        iosAdMobManager.initialize(appId: "ca-app-pub-xxx~xxx")
        
        return true
    }
}

5. Info.plist配置

在iOS项目的Info.plist中添加必要配置:

  • 添加键GADApplicationIdentifier,值为你的AdMob App ID
  • 若需要用户跟踪权限,添加NSUserTrackingUsageDescription,填写跟踪用途说明(例如:"需要跟踪您的行为以提供个性化广告")

6. 扩展其他广告类型(示例:插屏广告)

如果需要插屏广告,可在IosAdMobManager中扩展方法:

import platform.GoogleMobileAds.GADInterstitialAd
import platform.GoogleMobileAds.GADInterstitialAdLoadCompletionHandler

class IosAdMobManager(private val window: UIWindow) : AdMobManager {
    // 保留原有Banner相关代码...
    
    private var interstitialAd: GADInterstitialAd? = null

    fun loadInterstitialAd(adUnitId: String) {
        GADInterstitialAd.loadAdWithAdUnitID(
            adUnitId,
            request = GADRequest(),
            completionHandler = { ad, error ->
                if (error == null) {
                    interstitialAd = ad
                }
            }
        )
    }

    fun showInterstitialAd() {
        interstitialAd?.presentFromRootViewController(window.rootViewController)
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 06:05:13