添加applovin广告,广告流程优化

This commit is contained in:
zeng 2025-07-11 17:43:00 +08:00
parent ffc984babe
commit a399554e58
13 changed files with 138 additions and 70 deletions

View File

@ -122,7 +122,7 @@ extension SceneDelegate {
window?.rootViewController = guideVc window?.rootViewController = guideVc
window?.makeKeyAndVisible() window?.makeKeyAndVisible()
} else if !SPAPPTool.isAppOpen, hasOpenApp == true, SPNetworkReachabilityManager.manager.isReachable == true { //广 } else if !SPAPPTool.isAppOpen, hasOpenApp == true, SPNetworkReachabilityManager.manager.isReachable == true, SPLoginManager.manager.userInfo?.user_level == .ad { //广
let openAdVC = SPAppOpenAdViewController() let openAdVC = SPAppOpenAdViewController()
openAdVC.didEndBlock = { [weak self] in openAdVC.didEndBlock = { [weak self] in
self?.handleOpenApp() self?.handleOpenApp()

View File

@ -15,7 +15,15 @@ class SPAdAPI {
param.method = .get param.method = .get
SPNetwork.request(parameters: param) { (response: SPNetworkResponse<SPAdDataModel>) in SPNetwork.request(parameters: param) { (response: SPNetworkResponse<SPAdDataModel>) in
completer?(response.data?.ad) if response.code != SPNetworkCodeSucceed || response.data?.ad?.platform_key == nil {
let adInfo = SPAdInfo()
adInfo.platform_key = .google
adInfo.ads_id = SPAdManager.manager.admob_rewardedAdUnitID
completer?(adInfo)
} else {
completer?(response.data?.ad)
}
} }
} }

View File

@ -77,6 +77,12 @@ extension SPWebViewController {
} }
} else if name == WebMessageOpenCheckSignIn { // } else if name == WebMessageOpenCheckSignIn { //
guard SPRewardedAdManager.manager.isAdAvailable() else {
SPRewardedAdManager.manager.showToast()
return
}
self.needAutoRefresh = false self.needAutoRefresh = false
let manager = SPRewardedAdManager.manager let manager = SPRewardedAdManager.manager
manager.statScene = .reward manager.statScene = .reward

View File

@ -118,11 +118,14 @@ extension SPMineViewController {
guard SPLoginManager.manager.userInfo?.user_level == .ad else { return } guard SPLoginManager.manager.userInfo?.user_level == .ad else { return }
guard needShowRewardedAd else { return } guard needShowRewardedAd else { return }
needShowRewardedAd = false needShowRewardedAd = false
guard SPRewardedAdManager.manager.isEnable else { return } guard SPRewardedAdManager.manager.isAdAvailable() else {
return
}
let manager = SPRewardedAdManager.manager let manager = SPRewardedAdManager.manager
manager.delegate = nil
manager.statScene = .me manager.statScene = .me
manager.loadAndShowRewardedAd() manager.loadAndShowRewardedAd(isShowToast: false)
} }
} }

View File

@ -142,6 +142,12 @@ extension SPPlayerListViewModel {
} }
func adUnlockVideo(finish: (() -> Void)?) { func adUnlockVideo(finish: (() -> Void)?) {
guard SPRewardedAdManager.manager.isAdAvailable() else {
SPRewardedAdManager.manager.showToast()
return
}
let manager = SPRewardedAdManager.manager let manager = SPRewardedAdManager.manager
manager.delegate = self manager.delegate = self
manager.videoInfo = self.currentPlayer?.videoInfo manager.videoInfo = self.currentPlayer?.videoInfo

View File

@ -25,9 +25,8 @@ class SPAppOpenAdManager: NSObject {
weak var delegate: SPAppOpenAdManagerDelegate? weak var delegate: SPAppOpenAdManagerDelegate?
#if DEBUG let adUnitID = SPAdManager.manager.appOpenAdUnitID
let adUnitID = "ca-app-pub-3940256099942544/5575463023"
#endif
private var appOpenAd: AppOpenAd? private var appOpenAd: AppOpenAd?
private(set) var isLoadingAd = false private(set) var isLoadingAd = false

View File

@ -22,9 +22,7 @@ import GoogleMobileAds
class SPBannerAd: NSObject { class SPBannerAd: NSObject {
#if DEBUG let adUnitID = SPAdManager.manager.bannerAdUnitID
let adUnitID = "ca-app-pub-3940256099942544/2435281174"
#endif
let size = CGSize.init(width: kSPScreenWidth, height: 59) let size = CGSize.init(width: kSPScreenWidth, height: 59)
@ -97,7 +95,7 @@ extension SPBannerAd {
model.ads_id = adUnitID model.ads_id = adUnitID
model.ad_platform_key = .google model.ad_platform_key = .google
model.error_msg = errorMsg model.error_msg = errorMsg
model.scene = .splash model.scene = .banner
SPStatAPI.requestStatAd(model: model) SPStatAPI.requestStatAd(model: model)
} }

View File

@ -66,7 +66,7 @@ extension SPRewardedAdManager {
guard !self.admob_isLoadingRewardedAd else { return } guard !self.admob_isLoadingRewardedAd else { return }
#if DEBUG #if DEBUG
adInfo.ads_id = "ca-app-pub-3940256099942544/1712485313" adInfo.ads_id = SPAdManager.manager.admob_rewardedAdUnitID
#endif #endif
let adUnitID = adInfo.ads_id ?? "" let adUnitID = adInfo.ads_id ?? ""

View File

@ -20,7 +20,6 @@ extension SPRewardedAdManager {
static var appLovin_rewardedAd: Int? static var appLovin_rewardedAd: Int?
static var appLovin_needShowRewardedAd: Int? static var appLovin_needShowRewardedAd: Int?
static var appLovin_isLoadingRewardedAd: Int? static var appLovin_isLoadingRewardedAd: Int?
static var appLovin_retryAttempt: Int?
} }
#if canImport(AppLovinSDK) #if canImport(AppLovinSDK)
@ -33,15 +32,6 @@ extension SPRewardedAdManager {
} }
} }
private var appLovin_retryAttempt: CGFloat {
set {
objc_setAssociatedObject(self, &AssociatedKeys.appLovin_retryAttempt, newValue, .OBJC_ASSOCIATION_ASSIGN)
}
get {
return (objc_getAssociatedObject(self, &AssociatedKeys.appLovin_retryAttempt) as? CGFloat) ?? 0
}
}
///广true广广 ///广true广广
private var appLovin_needShowRewardedAd: Bool { private var appLovin_needShowRewardedAd: Bool {
set { set {
@ -63,13 +53,22 @@ extension SPRewardedAdManager {
} }
#endif #endif
func appLovin_isReady() -> Bool {
#if canImport(AppLovinSDK)
return appLovin_rewardedAd?.isReady ?? false
#else
return false
#endif
}
///广 ///广
func appLovin_loadRewardedAd() { func appLovin_loadRewardedAd(adInfo: SPAdInfo) {
#if canImport(AppLovinSDK) #if canImport(AppLovinSDK)
if !appLovin_isLoadingRewardedAd { if !appLovin_isLoadingRewardedAd {
self.appLovin_isLoadingRewardedAd = true self.appLovin_isLoadingRewardedAd = true
appLovin_rewardedAd = MARewardedAd.shared(withAdUnitIdentifier: appLovin_adUnitID) appLovin_rewardedAd = MARewardedAd.shared(withAdUnitIdentifier: adInfo.ads_id ?? "")
appLovin_rewardedAd?.delegate = self appLovin_rewardedAd?.delegate = self
appLovin_rewardedAd?.load() appLovin_rewardedAd?.load()
} }
@ -77,14 +76,14 @@ extension SPRewardedAdManager {
} }
///广 ///广
func appLovin_loadAndShowRewardedAd() { func appLovin_loadAndShowRewardedAd(adInfo: SPAdInfo) {
#if canImport(AppLovinSDK) #if canImport(AppLovinSDK)
self.appLovin_needShowRewardedAd = true self.appLovin_needShowRewardedAd = true
if appLovin_rewardedAd?.isReady == true { if appLovin_rewardedAd?.isReady == true {
self.appLovin_show() self.appLovin_show()
} else { } else {
appLovin_loadRewardedAd() appLovin_loadRewardedAd(adInfo: adInfo)
} }
#endif #endif
} }
@ -104,55 +103,55 @@ extension SPRewardedAdManager {
} }
#if canImport(AppLovinSDK) #if canImport(AppLovinSDK)
//MARK: -------------- MARewardedAdDelegate --------------
extension SPRewardedAdManager: MARewardedAdDelegate { extension SPRewardedAdManager: MARewardedAdDelegate {
func didLoad(_ ad: MAAd) func didLoad(_ ad: MAAd)
{ {
self.appLovin_isLoadingRewardedAd = false self.appLovin_isLoadingRewardedAd = false
// Rewarded ad is ready to show. '[self.rewardedAd isReady]' now returns 'YES'.
// Reset retry attempt loadFinishHandler()
appLovin_retryAttempt = 0
appLovin_show() appLovin_show()
} }
func didFailToLoadAd(forAdUnitIdentifier adUnitIdentifier: String, withError error: MAError) func didFailToLoadAd(forAdUnitIdentifier adUnitIdentifier: String, withError error: MAError)
{ {
// Rewarded ad failed to load self.appLovin_isLoadingRewardedAd = false
// AppLovin recommends that you retry with exponentially higher delays up to a maximum delay (in this case 64 seconds).
appLovin_retryAttempt += 1 let nsError = NSError(domain: error.message, code: error.code.rawValue)
let delaySec = pow(2.0, min(6.0, appLovin_retryAttempt)) loadFailHandler(error: nsError)
DispatchQueue.main.asyncAfter(deadline: .now() + delaySec) {
self.appLovin_rewardedAd?.load()
}
} }
func didDisplay(_ ad: MAAd) {} func didDisplay(_ ad: MAAd) {
self.didShowHandler()
}
func didClick(_ ad: MAAd) {} func didClick(_ ad: MAAd) {
self.didClickHandler()
}
func didHide(_ ad: MAAd) func didHide(_ ad: MAAd)
{ {
// Rewarded ad is hidden. Pre-load the next ad self.didDismissHandler()
self.appLovin_isLoadingRewardedAd = false
appLovin_loadRewardedAd()
} }
func didFail(toDisplay ad: MAAd, withError error: MAError) func didFail(toDisplay ad: MAAd, withError error: MAError)
{ {
// Rewarded ad failed to display. AppLovin recommends that you load the next ad. // Rewarded ad failed to display. AppLovin recommends that you load the next ad.
self.appLovin_isLoadingRewardedAd = false self.appLovin_isLoadingRewardedAd = false
appLovin_loadRewardedAd() // appLovin_loadRewardedAd()
let nsError = NSError(domain: error.message, code: error.code.rawValue)
displayFailHandler(error: nsError)
} }
// MARK: MARewardedAdDelegate Protocol
func didRewardUser(for ad: MAAd, with reward: MAReward) func didRewardUser(for ad: MAAd, with reward: MAReward)
{ {
// Rewarded ad was displayed and user should receive the reward // Rewarded ad was displayed and user should receive the reward
self.userDidEarnRewardHandler()
} }

View File

@ -63,16 +63,18 @@ class SPRewardedAdManager: NSObject {
guard let adInfo = adInfo else { return false } guard let adInfo = adInfo else { return false }
if adInfo.platform_key == .google { if adInfo.platform_key == .google {
return admob_rewardedAd != nil ? true : false return admob_rewardedAd != nil ? true : false
} else if adInfo.platform_key == .applovin {
return appLovin_isReady()
} }
return false return false
} }
///广 ///广
func loadAndShowRewardedAd(isShowLoading: Bool = true, isShowToast: Bool = true) { func loadAndShowRewardedAd(isShowLoading: Bool = false, isShowToast: Bool = true) {
guard isEnable else { guard isEnable else {
let text = "movia_no_ads_tip".localized let text = "movia_no_ads_tip".localized
if isShowToast { if isShowToast {
SPToast.show(text: text) self.showToast(text: text)
} }
self.isShowToast = false self.isShowToast = false
self.isShowLoading = false self.isShowLoading = false
@ -91,6 +93,8 @@ class SPRewardedAdManager: NSObject {
if let adInfo = adInfo {//广 if let adInfo = adInfo {//广
if adInfo.platform_key == .google { if adInfo.platform_key == .google {
self.admob_loadAndShowRewardedAd(adInfo: adInfo) self.admob_loadAndShowRewardedAd(adInfo: adInfo)
} else if adInfo.platform_key == .applovin {
self.appLovin_loadAndShowRewardedAd(adInfo: adInfo)
} }
} else { } else {
@ -108,6 +112,8 @@ class SPRewardedAdManager: NSObject {
self.adInfo = adInfo self.adInfo = adInfo
if adInfo.platform_key == .google { if adInfo.platform_key == .google {
self.admob_loadAndShowRewardedAd(adInfo: adInfo) self.admob_loadAndShowRewardedAd(adInfo: adInfo)
} else if adInfo.platform_key == .applovin {
self.appLovin_loadAndShowRewardedAd(adInfo: adInfo)
} else { } else {
self.adInfo = nil self.adInfo = nil
} }
@ -135,6 +141,8 @@ class SPRewardedAdManager: NSObject {
self.adInfo = adInfo self.adInfo = adInfo
if adInfo.platform_key == .google { if adInfo.platform_key == .google {
self.admob_loadRewardedAd(adInfo: adInfo) self.admob_loadRewardedAd(adInfo: adInfo)
} else if adInfo.platform_key == .applovin {
self.appLovin_loadRewardedAd(adInfo: adInfo)
} else { } else {
self.adInfo = nil self.adInfo = nil
} }
@ -186,7 +194,7 @@ extension SPRewardedAdManager {
SPHUD.dismiss() SPHUD.dismiss()
} }
if isShowToast { if isShowToast {
SPToast.show(text: "movia_no_ads_tip".localized) self.showToast()
} }
self.isLoadingRewardedAd = false self.isLoadingRewardedAd = false
self.delegate?.rewardedAdManager?(manager: self, didLoadFail: error) self.delegate?.rewardedAdManager?(manager: self, didLoadFail: error)
@ -214,7 +222,7 @@ extension SPRewardedAdManager {
SPHUD.dismiss() SPHUD.dismiss()
} }
if isShowToast { if isShowToast {
SPToast.show(text: "movia_no_ads_tip".localized) self.showToast()
} }
self.delegate?.rewardedAdManager?(manager: self, didDisplayFail: error) self.delegate?.rewardedAdManager?(manager: self, didDisplayFail: error)
self.requestStatAd(type: "show_failed", errorMsg: error.localizedDescription) self.requestStatAd(type: "show_failed", errorMsg: error.localizedDescription)
@ -263,7 +271,6 @@ extension SPRewardedAdManager {
} }
//MARK: -------------- --------------
extension SPRewardedAdManager { extension SPRewardedAdManager {
private func requestStatAd(type: String, seconds: Int = 0, errorMsg: String?, completer: (() -> Void)? = nil) { private func requestStatAd(type: String, seconds: Int = 0, errorMsg: String?, completer: (() -> Void)? = nil) {
@ -288,4 +295,8 @@ extension SPRewardedAdManager {
self.requestStatAd(type: "Interrupt", seconds: 0, errorMsg: nil) self.requestStatAd(type: "Interrupt", seconds: 0, errorMsg: nil)
} }
func showToast(text: String? = "movia_no_ads_tip".localized) {
SPToast.show(text: text)
}
} }

View File

@ -11,6 +11,7 @@ import SmartCodable
enum SPAdPlatformKey: String, SmartCaseDefaultable { enum SPAdPlatformKey: String, SmartCaseDefaultable {
case google = "google" case google = "google"
case applovin = "applovin"
} }
class SPAdDataModel: SPModel, SmartCodable { class SPAdDataModel: SPModel, SmartCodable {

View File

@ -24,22 +24,56 @@ class SPAdManager: NSObject {
#if canImport(AppLovinSDK) #if canImport(AppLovinSDK)
// //
// let initConfig = ALSdkInitializationConfiguration(sdkKey: "«SDK-key»") { builder in let initConfig = ALSdkInitializationConfiguration(sdkKey: "XW2aulJv9urKD4MIIFT1xcSCuyTHaDZ9qUbDqygnTLS04GkdX7WMQJviGP5vDRWGsk4OJJIyLGRV3mbLqOWx0W") { builder in
// builder.mediationProvider = ALMediationProviderMAX builder.mediationProvider = ALMediationProviderMAX
// } #if DEBUG
// builder.testDeviceAdvertisingIdentifiers = [JXUUID.idfa()]
// // Initialize the SDK with the configuration #endif
// ALSdk.shared().initialize(with: initConfig) { sdkConfig in }
// // Start loading ads
// } // Initialize the SDK with the configuration
ALSdk.shared().initialize(with: initConfig) { sdkConfig in
// Start loading ads
}
#endif #endif
// SPRewardedAdManager.manager.preloadRewardedAd()
} }
} }
//MARK: -------------- ID --------------
extension SPAdManager {
///广ID
var admob_rewardedAdUnitID: String {
#if DEBUG
return "ca-app-pub-3940256099942544/1712485313"
#else
return ""
#endif
}
///广ID
var appOpenAdUnitID: String {
#if DEBUG
return "ca-app-pub-3940256099942544/5575463023"
#else
return ""
#endif
}
///广ID
var bannerAdUnitID: String {
#if DEBUG
return "ca-app-pub-3940256099942544/2435281174"
#else
return ""
#endif
}
}

View File

@ -51,23 +51,26 @@ class SPUserInfo: SPModel, SmartCodable, NSSecureCoding {
func encode(with coder: NSCoder) { func encode(with coder: NSCoder) {
// coder.encode(id, forKey: "id") coder.encode(id, forKey: "id")
// coder.encode(phone, forKey: "phone") coder.encode(customer_id, forKey: "customer_id")
// coder.encode(userToken, forKey: "userToken") coder.encode(user_level?.rawValue, forKey: "user_level")
// coder.encode(ipAddress, forKey: "ipAddress") coder.encode(is_vip, forKey: "is_vip")
// coder.encode(audioNum, forKey: "audioNum") coder.encode(family_name, forKey: "family_name")
// coder.encode(audioSeconds, forKey: "audioSeconds") coder.encode(giving_name, forKey: "giving_name")
} }
required init?(coder: NSCoder) { required init?(coder: NSCoder) {
super.init() super.init()
// id = coder.decodeObject(of: NSString.self, forKey: "id") as? String id = coder.decodeObject(of: NSString.self, forKey: "id") as? String
// phone = coder.decodeObject(of: NSString.self, forKey: "phone") as? String customer_id = coder.decodeObject(of: NSString.self, forKey: "customer_id") as? String
// userToken = coder.decodeObject(of: NSString.self, forKey: "userToken") as? String if let user_level = coder.decodeObject(of: NSString.self, forKey: "user_level") as? String {
// ipAddress = coder.decodeObject(of: NSString.self, forKey: "ipAddress") as? String self.user_level = UserLevel(rawValue: user_level)
// audioNum = coder.decodeObject(of: NSNumber.self, forKey: "audioNum")?.intValue }
// audioSeconds = coder.decodeObject(of: NSNumber.self, forKey: "audioSeconds")?.intValue is_vip = coder.decodeBool(forKey: "is_vip")
family_name = coder.decodeObject(of: NSString.self, forKey: "family_name") as? String
giving_name = coder.decodeObject(of: NSString.self, forKey: "giving_name") as? String
} }
} }