如何创建观看广告奖励函数?游戏激励视频结束触发加分方案
解决激励视频奖励与分数提升的问题
看起来你已经在使用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
相关产品推荐
相关产品推荐

