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

如何创建观看广告奖励函数?游戏激励视频结束触发加分方案

解决激励视频奖励与分数提升的问题

看起来你已经在使用Appodeal做广告集成了,针对你的两个需求,我给你整理了完整的实现方案,直接套进你的Page1控制器里就行:

第一步:修正代理协议与初始化

首先,你的控制器需要遵循激励视频专属的代理协议(不是插屏的AppodealInterstitialDelegate),然后完成Appodeal的初始化和代理绑定:

class Page1: UIViewController, AVAudioPlayerDelegate, GADInterstitialDelegate, UIAlertViewDelegate, GKGameCenterControllerDelegate, AppodealRewardedVideoDelegate {
    
    // 假设你有存储当前分数的变量,这里用UserDefaults做持久化
    var currentScore: Int {
        get { UserDefaults.standard.integer(forKey: "gameScore") }
        set { UserDefaults.standard.set(newValue, forKey: "gameScore") }
    }
    // 假设你有显示分数的Label
    @IBOutlet weak var scoreLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 保留你原来的初始化代码(Firebase、音频、GameCenter等)...
        
        // 绑定激励视频代理
        Appodeal.setRewardedVideoDelegate(self)
        // 初始化Appodeal,指定加载激励视频类型
        Appodeal.initialize(withApiKey: "你的Appodeal API Key", types: .rewardedVideo)
    }

第二步:创建显示激励视频的触发方法

在游戏结束界面加个按钮(比如“看广告加100分”),绑定这个方法来触发广告:

@IBAction func showRewardVideoForScore(_ sender: UIButton) {
    // 先判断广告是否加载完成,避免点击后无反应
    if Appodeal.isReady(for: .rewardedVideo) {
        Appodeal.showAd(.rewardedVideo, rootViewController: self)
    } else {
        // 给用户友好提示
        let alert = UIAlertController(title: "提示", message: "广告正在加载,请稍等片刻", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "好的", style: .default))
        present(alert, animated: true)
    }
}

第三步:实现奖励回调与加分逻辑

这是最核心的部分——当用户完整看完广告后,Appodeal会通过代理方法通知我们,此时执行加分操作:

// 广告观看完成并符合奖励条件时的回调(核心!)
func appodealRewardVideoDidFinish(_ reward: Bool, name: String?, amount: Double) {
    guard reward else {
        // reward为false时,说明用户没看完或不符合奖励规则,不加分
        print("用户未完成广告观看,不给予奖励")
        return
    }
    
    // 调用加分函数,直接加100分
    increaseScore(by: 100)
    // 更新UI显示最新分数
    updateScoreLabel()
    
    // 如果需要同步分数到Firebase,这里可以添加云端同步逻辑
    // let userRef = Database.database().reference().child("users").child(当前用户ID)
    // userRef.updateChildValues(["score": currentScore])
}

// 通用加分函数(兼容你原来的"每次加1分"需求)
func increaseScore(by points: Int) {
    currentScore += points
    // 原来的加1分逻辑可以改成调用这个方法:
    // func addOnePoint() { increaseScore(by: 1) }
}

// 更新分数显示的方法
func updateScoreLabel() {
    scoreLabel.text = "当前分数: \(currentScore)"
}

可选:补充调试用的回调方法

这些方法能帮你排查广告加载或播放中的问题:

// 激励视频加载完成
func appodealRewardedVideoDidLoad() {
    print("✅ 激励视频加载完成")
}

// 激励视频加载失败
func appodealRewardedVideoDidFailToLoad() {
    print("❌ 激励视频加载失败")
}

// 用户中途关闭视频
func appodealRewardVideoDidClose(_ finished: Bool) {
    if !finished {
        print("⚠️ 用户中途退出视频,未获得奖励")
    }
}

关键注意点:

  • 一定要用AppodealRewardedVideoDelegate,不要和插屏广告的代理混淆,两者的回调逻辑完全不同
  • 只有当appodealRewardVideoDidFinish里的reward参数为true时,才执行加分操作,避免用户没看完广告就拿到奖励
  • 分数用UserDefaults或云端存储做持久化,防止APP重启后分数丢失

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:59:55