添加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?.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()
openAdVC.didEndBlock = { [weak self] in
self?.handleOpenApp()

View File

@ -15,8 +15,16 @@ class SPAdAPI {
param.method = .get
SPNetwork.request(parameters: param) { (response: SPNetworkResponse<SPAdDataModel>) in
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 { //
guard SPRewardedAdManager.manager.isAdAvailable() else {
SPRewardedAdManager.manager.showToast()
return
}
self.needAutoRefresh = false
let manager = SPRewardedAdManager.manager
manager.statScene = .reward

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -20,7 +20,6 @@ extension SPRewardedAdManager {
static var appLovin_rewardedAd: Int?
static var appLovin_needShowRewardedAd: Int?
static var appLovin_isLoadingRewardedAd: Int?
static var appLovin_retryAttempt: Int?
}
#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广广
private var appLovin_needShowRewardedAd: Bool {
set {
@ -63,13 +53,22 @@ extension SPRewardedAdManager {
}
#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 !appLovin_isLoadingRewardedAd {
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?.load()
}
@ -77,14 +76,14 @@ extension SPRewardedAdManager {
}
///广
func appLovin_loadAndShowRewardedAd() {
func appLovin_loadAndShowRewardedAd(adInfo: SPAdInfo) {
#if canImport(AppLovinSDK)
self.appLovin_needShowRewardedAd = true
if appLovin_rewardedAd?.isReady == true {
self.appLovin_show()
} else {
appLovin_loadRewardedAd()
appLovin_loadRewardedAd(adInfo: adInfo)
}
#endif
}
@ -104,55 +103,55 @@ extension SPRewardedAdManager {
}
#if canImport(AppLovinSDK)
//MARK: -------------- MARewardedAdDelegate --------------
extension SPRewardedAdManager: MARewardedAdDelegate {
func didLoad(_ ad: MAAd)
{
self.appLovin_isLoadingRewardedAd = false
// Rewarded ad is ready to show. '[self.rewardedAd isReady]' now returns 'YES'.
// Reset retry attempt
appLovin_retryAttempt = 0
loadFinishHandler()
appLovin_show()
}
func didFailToLoadAd(forAdUnitIdentifier adUnitIdentifier: String, withError error: MAError)
{
// Rewarded ad failed to load
// AppLovin recommends that you retry with exponentially higher delays up to a maximum delay (in this case 64 seconds).
self.appLovin_isLoadingRewardedAd = false
appLovin_retryAttempt += 1
let delaySec = pow(2.0, min(6.0, appLovin_retryAttempt))
DispatchQueue.main.asyncAfter(deadline: .now() + delaySec) {
self.appLovin_rewardedAd?.load()
}
let nsError = NSError(domain: error.message, code: error.code.rawValue)
loadFailHandler(error: nsError)
}
func didDisplay(_ ad: MAAd) {}
func didDisplay(_ ad: MAAd) {
self.didShowHandler()
}
func didClick(_ ad: MAAd) {}
func didClick(_ ad: MAAd) {
self.didClickHandler()
}
func didHide(_ ad: MAAd)
{
// Rewarded ad is hidden. Pre-load the next ad
self.appLovin_isLoadingRewardedAd = false
appLovin_loadRewardedAd()
self.didDismissHandler()
}
func didFail(toDisplay ad: MAAd, withError error: MAError)
{
// Rewarded ad failed to display. AppLovin recommends that you load the next ad.
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)
{
// 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 }
if adInfo.platform_key == .google {
return admob_rewardedAd != nil ? true : false
} else if adInfo.platform_key == .applovin {
return appLovin_isReady()
}
return false
}
///广
func loadAndShowRewardedAd(isShowLoading: Bool = true, isShowToast: Bool = true) {
func loadAndShowRewardedAd(isShowLoading: Bool = false, isShowToast: Bool = true) {
guard isEnable else {
let text = "movia_no_ads_tip".localized
if isShowToast {
SPToast.show(text: text)
self.showToast(text: text)
}
self.isShowToast = false
self.isShowLoading = false
@ -91,6 +93,8 @@ class SPRewardedAdManager: NSObject {
if let adInfo = adInfo {//广
if adInfo.platform_key == .google {
self.admob_loadAndShowRewardedAd(adInfo: adInfo)
} else if adInfo.platform_key == .applovin {
self.appLovin_loadAndShowRewardedAd(adInfo: adInfo)
}
} else {
@ -108,6 +112,8 @@ class SPRewardedAdManager: NSObject {
self.adInfo = adInfo
if adInfo.platform_key == .google {
self.admob_loadAndShowRewardedAd(adInfo: adInfo)
} else if adInfo.platform_key == .applovin {
self.appLovin_loadAndShowRewardedAd(adInfo: adInfo)
} else {
self.adInfo = nil
}
@ -135,6 +141,8 @@ class SPRewardedAdManager: NSObject {
self.adInfo = adInfo
if adInfo.platform_key == .google {
self.admob_loadRewardedAd(adInfo: adInfo)
} else if adInfo.platform_key == .applovin {
self.appLovin_loadRewardedAd(adInfo: adInfo)
} else {
self.adInfo = nil
}
@ -186,7 +194,7 @@ extension SPRewardedAdManager {
SPHUD.dismiss()
}
if isShowToast {
SPToast.show(text: "movia_no_ads_tip".localized)
self.showToast()
}
self.isLoadingRewardedAd = false
self.delegate?.rewardedAdManager?(manager: self, didLoadFail: error)
@ -214,7 +222,7 @@ extension SPRewardedAdManager {
SPHUD.dismiss()
}
if isShowToast {
SPToast.show(text: "movia_no_ads_tip".localized)
self.showToast()
}
self.delegate?.rewardedAdManager?(manager: self, didDisplayFail: error)
self.requestStatAd(type: "show_failed", errorMsg: error.localizedDescription)
@ -263,7 +271,6 @@ extension SPRewardedAdManager {
}
//MARK: -------------- --------------
extension SPRewardedAdManager {
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)
}
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 {
case google = "google"
case applovin = "applovin"
}
class SPAdDataModel: SPModel, SmartCodable {

View File

@ -24,22 +24,56 @@ class SPAdManager: NSObject {
#if canImport(AppLovinSDK)
//
// let initConfig = ALSdkInitializationConfiguration(sdkKey: "«SDK-key»") { builder in
// builder.mediationProvider = ALMediationProviderMAX
// }
//
// // Initialize the SDK with the configuration
// ALSdk.shared().initialize(with: initConfig) { sdkConfig in
// // Start loading ads
// }
let initConfig = ALSdkInitializationConfiguration(sdkKey: "XW2aulJv9urKD4MIIFT1xcSCuyTHaDZ9qUbDqygnTLS04GkdX7WMQJviGP5vDRWGsk4OJJIyLGRV3mbLqOWx0W") { builder in
builder.mediationProvider = ALMediationProviderMAX
#if DEBUG
builder.testDeviceAdvertisingIdentifiers = [JXUUID.idfa()]
#endif
}
// Initialize the SDK with the configuration
ALSdk.shared().initialize(with: initConfig) { sdkConfig in
// Start loading ads
}
#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) {
// coder.encode(id, forKey: "id")
// coder.encode(phone, forKey: "phone")
// coder.encode(userToken, forKey: "userToken")
// coder.encode(ipAddress, forKey: "ipAddress")
// coder.encode(audioNum, forKey: "audioNum")
// coder.encode(audioSeconds, forKey: "audioSeconds")
coder.encode(id, forKey: "id")
coder.encode(customer_id, forKey: "customer_id")
coder.encode(user_level?.rawValue, forKey: "user_level")
coder.encode(is_vip, forKey: "is_vip")
coder.encode(family_name, forKey: "family_name")
coder.encode(giving_name, forKey: "giving_name")
}
required init?(coder: NSCoder) {
super.init()
// id = coder.decodeObject(of: NSString.self, forKey: "id") as? String
// phone = coder.decodeObject(of: NSString.self, forKey: "phone") as? String
// userToken = coder.decodeObject(of: NSString.self, forKey: "userToken") as? String
// ipAddress = coder.decodeObject(of: NSString.self, forKey: "ipAddress") as? String
// audioNum = coder.decodeObject(of: NSNumber.self, forKey: "audioNum")?.intValue
// audioSeconds = coder.decodeObject(of: NSNumber.self, forKey: "audioSeconds")?.intValue
id = coder.decodeObject(of: NSString.self, forKey: "id") as? String
customer_id = coder.decodeObject(of: NSString.self, forKey: "customer_id") as? String
if let user_level = coder.decodeObject(of: NSString.self, forKey: "user_level") as? String {
self.user_level = UserLevel(rawValue: user_level)
}
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
}
}