Music_Player3/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_AdMobManager.swift
2024-09-27 11:20:47 +08:00

1882 lines
84 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// MP_AdMobManager.swift
// relax.offline.mp3.music
//
// Created by Mr.Zhou on 2024/6/14.
//
import UIKit
import AVFoundation
import GoogleMobileAds
import AppLovinAdapter
import AppLovinSDK
import LiftoffMonetizeAdapter
import VungleAdsSDK
import PangleAdapter
import PAGAdSDK
import IronSourceAdapter
import IronSource
import MintegralAdapter
import MTGSDK
import ChartboostSDK
import ChartboostAdapter
///AdMob广
class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenContentDelegate, GADNativeAdLoaderDelegate, GADNativeAdDelegate, GADVideoControllerDelegate {
static let shared = MP_AdMobManager()
///广
private var openAdStatus:Bool = MP_ADSimpleManager.shared.openAdStatus
///使广
private var internalAdStatus:Bool = MP_ADSimpleManager.shared.internalAdStatus
private let sharedInstance = GADMobileAds.sharedInstance()
///广(50)
private let expirationTime:TimeInterval = 3000
//广
private func wasAdexpirationTime(_ date:Date?) -> Bool {
guard let loadTime = date else { return false }
// Check if ad was loaded more than four hours ago.
return Date().timeIntervalSince(loadTime) < expirationTime
}
//MARK: - 广
///广
private var interstitialSwitch:Bool = false{
didSet{
DispatchQueue.main.async {
[weak self] in
MPSideA_MediaCenterManager.shared.isAdLate = self?.interstitialSwitch
}
}
}
///广
var interstitialDate:Date?
///广(40)
private var interstitialDuration:TimeInterval{
get{
if let times = UserDefaults.standard.object(forKey: "InterstitialDuration") as? TimeInterval {
return times
}else {
return 40
}
}
}
///
private var intermediaryDuration:TimeInterval{
get{
if let times = UserDefaults.standard.object(forKey: "IntermediaryDuration") as? TimeInterval {
return times
}else {
return 40
}
}
}
///
private var intermediaryOpenShowTime:Date?
///
private var intermediaryInterstitialShowTime:Date?
//
private var isPassIntermediary:Bool = true
///
func setInterstitialSwitch(_ status:Bool) {
interstitialSwitch = status
}
///
func getInterstitialSwitch() -> Bool {
return interstitialSwitch
}
///广
func setInterstitialDuration(_ duration:TimeInterval?) {
if let times = duration {
UserDefaults.standard.set(times, forKey: "InterstitialDuration")
}
}
///
func setIntermediaryDuration(_ duration:TimeInterval?) {
if let times = duration {
UserDefaults.standard.set(times, forKey: "IntermediaryDuration")
}
}
///广
private func isShowInterstitialADAvailable(_ date:Date) -> Bool {
return Date().timeIntervalSince(date) > interstitialDuration
}
private override init() {
super.init()
NotificationCenter.notificationKey.add(observer: self, selector: #selector(netWorkReachableAction(_:)), notificationName: .net_switch_reachable)
GADMobileAds.sharedInstance().audioVideoManager.delegate = self
// GADMobileAds.sharedInstance().audioVideoManager.
reloadAdMobIDs()
//广
completeOpenAdBlock = {
[weak self] in
guard let self = self, interstitialSwitch == true else {return}
//广
appOpenAd = nil
appInterstitialAd = nil
isShowingOpenAd = false
loadOpenAdTime = nil
//广
interstitialSwitch = false
//广
intermediaryOpenShowTime = Date()
//广
DispatchQueue.main.asyncAfter(deadline: .now() + 4) {
[weak self] in
self?.loadOpenAd(.HOST) { status in
if status == true {
print("新的开屏广告加载成功")
}else {
print("开屏广告加载失败了")
}
}
}
}
//广
completeSearchInterstitialAdBlock = {
[weak self] in
guard let self = self, interstitialSwitch == true else {return}
//广
searchInterstitialAd = nil
isShowingSearchInterstitialAd = false
loadSearchInterstitialAdTime = nil
//广
interstitialSwitch = false
//广
intermediaryInterstitialShowTime = Date()
//广
DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
[weak self] in
self?.loadSearchInterstitialAd { status in
if status {
print("成功加载搜索插页广告")
}else {
print("搜索插页广告加载失败")
}
}
}
}
//广
completePlayInterstitialAdBlock = {
[weak self] in
guard let self = self, interstitialSwitch == true else {return}
//广
playInterstitialAd = nil
isShowingPlayInterstitialAd = false
loadPlayInterstitialAdTime = nil
//广
interstitialSwitch = false
//广
intermediaryInterstitialShowTime = Date()
//广
DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
[weak self] in
self?.loadPlayInterstitialAd { status in
if status {
print("成功加载播放插页广告")
}else {
print("播放插页广告加载失败")
}
}
}
}
//
completeSwitchInterstitialAdBlock = {
[weak self] in
guard let self = self, interstitialSwitch == true else {return}
//广
switchInterstitialAd = nil
isShowingSwitchInterstitialAd = false
loadSwitchInterstitialAdTime = nil
//广
interstitialSwitch = false
//广
intermediaryInterstitialShowTime = Date()
//广
DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
[weak self] in
self?.loadSwitchInterstitialAd { status in
if status {
print("成功加载切歌插页广告")
}else {
print("切歌插页广告加载失败")
}
}
}
}
//
completeLoadInterstitialAdBlock = {
[weak self] in
guard let self = self, interstitialSwitch == true else {return}
//广
loadInterstitialAd = nil
isShowingLoadInterstitialAd = false
loadLoadInterstitialAdTime = nil
//广
interstitialSwitch = false
//广
intermediaryInterstitialShowTime = Date()
//广
DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
[weak self] in
self?.loadLoadInterstitialAd { status in
if status {
print("成功加载下载插页广告")
}else {
print("下载插页广告加载失败")
}
}
}
}
//广
completeLibraryInterstitialAdBlock = {
[weak self] in
guard let self = self, interstitialSwitch == true else {return}
//广
libraryInterstitialAd = nil
isShowingLibraryInterstitialAd = false
loadLibraryInterstitialAdTime = nil
//广
interstitialSwitch = false
//广
intermediaryInterstitialShowTime = Date()
//广
DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
[weak self] in
self?.loadLibraryInterstitialAd { status in
if status {
print("成功加载曲库插页广告")
}else {
print("曲库插页广告加载失败")
}
}
}
}
//广
completeGlobalInterstitialAdBlock = {
[weak self] in
guard let self = self, interstitialSwitch == true else {return}
//广
globalInterstitialAd = nil
isShowingGlobalInterstitialAd = false
loadGlobalInterstitialAdTime = nil
//广
interstitialSwitch = false
//广
intermediaryInterstitialShowTime = Date()
//广
DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
[weak self] in
self?.loadGlobalInterstitialAd { status in
if status {
print("成功加载全局插页广告")
}else {
print("全局插页广告加载失败")
}
}
}
}
}
///ID
func reloadAdMobIDs() {
//广ID
if let data = UserDefaults.standard.object(forKey: "OpenICEID") as? Data, let array = jsonforCoreAdModel(data) {
print("成功提取ID")
OpenICEID = array.sorted(by: {$0.level > $1.level})
}
if let data = UserDefaults.standard.object(forKey: "OpenHOSTID") as? Data, let array = jsonforCoreAdModel(data) {
OpenHOSTID = array.sorted(by: {$0.level > $1.level})
}
if let data = UserDefaults.standard.object(forKey: "SearchINSERTID") as? Data, let array = jsonforCoreAdModel(data) {
SearchINSERTID = array.sorted(by: {$0.level > $1.level})
}
if let data = UserDefaults.standard.object(forKey: "SearchNATIVEID") as? Data, let array = jsonforCoreAdModel(data) {
SearchNATIVEID = array.sorted(by: {$0.level > $1.level})
}
if let data = UserDefaults.standard.object(forKey: "PlayerINSERTID") as? Data, let array = jsonforCoreAdModel(data) {
PlayerINSERTID = array.sorted(by: {$0.level > $1.level})
}
if let data = UserDefaults.standard.object(forKey: "SwitchINSERTID") as? Data, let array = jsonforCoreAdModel(data) {
SwitchINSERTID = array.sorted(by: {$0.level > $1.level})
}
if let data = UserDefaults.standard.object(forKey: "LoadINSERTID") as? Data, let array = jsonforCoreAdModel(data) {
LoadINSERTID = array.sorted(by: {$0.level > $1.level})
}
if let data = UserDefaults.standard.object(forKey: "LibraryINSERTID") as? Data, let array = jsonforCoreAdModel(data) {
LibraryINSERTID = array.sorted(by: {$0.level > $1.level})
}
if let data = UserDefaults.standard.object(forKey: "LibraryNATIVEID") as? Data, let array = jsonforCoreAdModel(data) {
LibraryNATIVEID = array.sorted(by: {$0.level > $1.level})
}
if let data = UserDefaults.standard.object(forKey: "GlobalINSERTID") as? Data, let array = jsonforCoreAdModel(data) {
GlobalINSERTID = array.sorted(by: {$0.level > $1.level})
}
}
///广
func loadMoreAdMobs() {
loadPlayInterstitialAd{status in
if status {
print("成功加载播放插页广告")
}else {
print("播放插页广告加载失败")
}
}
loadSearchInterstitialAd { status in
if status {
print("成功加载搜索插页广告")
}else {
print("搜索插页广告加载失败")
}
}
loadLibraryInterstitialAd { status in
if status {
print("成功加载曲库插页广告")
}else {
print("曲库插页广告加载失败")
}
}
}
//
@objc private func netWorkReachableAction(_ sender:Notification) {
DispatchQueue.main.async {
[weak self] in
guard let self = self else {return}
loadMoreAdMobs()
}
}
deinit{
NotificationCenter.default.removeObserver(self)
displaySearchTimer?.invalidate()
displaySearchTimer = nil
displayLibraryTimer?.invalidate()
displayLibraryTimer = nil
}
///广
func start() {
sharedInstance.start { status in
print("App启动开始加载广告")
let adapterStatuses = status.adapterStatusesByClassName
for adapter in adapterStatuses {
let adapterStatus = adapter.value
print("Adapter Name: \(adapter.key), Description: \(adapterStatus.description), Latency: \(adapterStatus.latency)")
}
}
}
///广
private func retrieveIntermediaryInterstitial() -> Bool {
//
guard let date = intermediaryInterstitialShowTime else {return true}
return Date().timeIntervalSince(date) > intermediaryDuration
}
///广
private func retrieveIntermediaryOpen() -> Bool {
//
guard let date = intermediaryOpenShowTime else {return true}
return Date().timeIntervalSince(date) > intermediaryDuration
}
//MARK: -
//广ID
private var OpenICEID:[MPPositive_AdItemModel] = []
//广ID
private var OpenHOSTID:[MPPositive_AdItemModel] = []
//广
var appOpenAd:GADAppOpenAd?
//广
var appInterstitialAd:GADInterstitialAd?
//广
private var isLoadingOpenAd:Bool = false
//广
var isShowingOpenAd:Bool = false
//广
private var loadOpenAdTime:Date?
//广(10)
private var openAppDuration:TimeInterval{
get{
if let times = UserDefaults.standard.object(forKey: "OpenAppDuration") as? TimeInterval {
return times
}else {
return 10
}
}
}
//广
func setOpenAppDuration(_ duration:TimeInterval) {
UserDefaults.standard.set(duration, forKey: "OpenAppDuration")
}
//广
func getOpenAppDuration() -> TimeInterval {
return self.openAppDuration
}
//广
var completeOpenAdBlock:(() -> Void)?
///广
func loadOpenAd(_ type:OpenType, level:Int = 0, completion: @escaping (Bool) -> Void) {
guard openAdStatus, internalAdStatus else {return}
// 广广
if isLoadingOpenAd || isOpenAdAvailable() {
// 广广
completion(false)
return
}
//id
var item:MPPositive_AdItemModel
switch type {
case .ICE:
guard OpenICEID.isEmpty == false else {
//
MP_AnalyticsManager.shared.cold_ads_showFailureAction("No IDs")
//
reloadAdMobIDs()
completion(false)
return
}
guard level < (OpenICEID.count) else {
print("冷启动广告组已经全部加载失败,停止继续加载")
MP_AnalyticsManager.shared.cold_ads_loadFailureAction("No Ads Fill")
completion(false)
return
}
item = OpenICEID[level]
case .HOST:
guard OpenHOSTID.isEmpty == false else {
//
MP_AnalyticsManager.shared.hot_ads_showFailureAction("No IDs")
//
reloadAdMobIDs()
completion(false)
return
}
guard level < (OpenHOSTID.count) else {
print("热启动广告组已经全部加载失败,停止继续加载")
MP_AnalyticsManager.shared.hot_ads_loadFailureAction("No Ads Fill")
completion(false)
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
[weak self] in
self?.loadOpenAd(.HOST, completion: { status in
if status {
print("重新加载热启动广告成功")
}else {
print("重新加载热启动广告失败")
}
})
}
return
}
item = OpenHOSTID[level]
}
isLoadingOpenAd = true
let request = GADRequest()
MP_ADSimpleManager.shared.isAdSounded()
//广
if item.type == .Open {
//广
// 使 GADAppOpenAd load completion handler广
GADAppOpenAd.load(withAdUnitID: item.identifier, request: request) { ad, error in
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
if let error = error {
print("加载开屏广告失败,失败原因: \(error.localizedDescription)已下调广告ID等级重新加载")
switch type {
case .ICE:
MP_AnalyticsManager.shared.cold_ads_loadFailureAction(error.localizedDescription)
case .HOST:
MP_AnalyticsManager.shared.hot_ads_loadFailureAction(error.localizedDescription)
}
self.isLoadingOpenAd = false
loadOpenAd(type, level: level+1, completion: completion)
} else {
self.appOpenAd = ad
self.isLoadingOpenAd = false
//
self.appOpenAd?.fullScreenContentDelegate = self
//
self.loadOpenAdTime = Date()
completion(true)
}
}
}
}else if item.type == .Insert {
//广
GADInterstitialAd.load(withAdUnitID: item.identifier, request: request ) { ad, error in
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
if let error = error {
print("加载开屏广告失败,失败原因: \(error.localizedDescription)已下调广告ID等级重新加载")
switch type {
case .ICE:
MP_AnalyticsManager.shared.cold_ads_loadFailureAction(error.localizedDescription)
case .HOST:
MP_AnalyticsManager.shared.hot_ads_loadFailureAction(error.localizedDescription)
}
self.isLoadingOpenAd = false
loadOpenAd(type, level: level+1, completion: completion)
} else {
self.appInterstitialAd = ad
self.isLoadingOpenAd = false
//
self.appInterstitialAd?.fullScreenContentDelegate = self
//
self.loadOpenAdTime = Date()
completion(true)
}
}
}
}else {
completion(false)
}
}
///广
func showOpenAdIfAvailable(_ type:OpenType, completion:((_ T:GADFullScreenPresentingAd, _ isOpen:Bool) -> Void)?) {
guard openAdStatus, internalAdStatus else {return}
// 广广广
guard !interstitialSwitch, !isShowingOpenAd, retrieveIntermediaryInterstitial() else { return }
// 广广
if !isOpenAdAvailable() {
loadOpenAd(type) { [weak self] success in
guard let self = self else { return }
if success {
self.showOpenAdIfAvailable(type, completion: completion)
}
}
if type == .HOST {
//广
showGlobalInterstitialAdIfAvailable { ad in
if let ad = ad {
if let block = completion {
block(ad, false)
}
}
}
}
return
}
if type == .ICE {
MP_AnalyticsManager.shared.cold_ads_chanceAction()
}else {
MP_AnalyticsManager.shared.hot_ads_chanceAction()
}
//广
if let ad = (appOpenAd) {
//
if let block = completion {
block(ad, true)
}else {
isShowingOpenAd = true
interstitialSwitch = true
DispatchQueue.main.async {
[weak self] in
guard let self = self else {return}
do{
try ad.canPresent(fromRootViewController: nil)
ad.present(fromRootViewController: nil)
}catch{
print("开屏广告展示失败,失败原因:\(error)")
if completeOpenAdBlock != nil {
completeOpenAdBlock!()
}
}
}
}
}else if let ad = (appInterstitialAd) {
//
if let block = completion {
block(ad, false)
}else {
isShowingOpenAd = true
interstitialSwitch = true
DispatchQueue.main.async {
[weak self] in
guard let self = self else {return}
do{
try ad.canPresent(fromRootViewController: nil)
ad.present(fromRootViewController: nil)
}catch{
print("开屏广告展示失败,失败原因:\(error)")
if completeOpenAdBlock != nil {
completeOpenAdBlock!()
}
}
}
}
}else {
print("开屏广告展示失败")
if type == .ICE {
MP_AnalyticsManager.shared.cold_ads_showFailureAction("Ad loading failed")
}else {
MP_AnalyticsManager.shared.hot_ads_showFailureAction("Ad loading failed")
}
}
}
///广
func isOpenAdAvailable() -> Bool {
return (appOpenAd != nil || appInterstitialAd != nil) && wasAdexpirationTime(loadOpenAdTime)
}
//MARK: -
//广ID
private var SearchINSERTID:[MPPositive_AdItemModel] = []
//广ID
private var SearchNATIVEID:[MPPositive_AdItemModel] = []
///广
private var searchInterstitialAd:GADInterstitialAd?
///广
private var isLoadingSearchInterstitialAd:Bool = false
///广
var isShowingSearchInterstitialAd:Bool = false
///
private var loadSearchInterstitialAdTime:Date?
///广
var completeSearchInterstitialAdBlock:(() -> Void)?
///广
var searchAdLoader:GADAdLoader?
///广
var searchNativeAd:GADNativeAd?
///广
var searchNativeAdView:GADNativeAdView?
///
var refreshSearchTimes:TimeInterval = 3600
///
var displaySearchTimer:Timer?
///
var expirationSearchDate:Date?
///
var searchViewController:UIViewController?
///
var onSearchNativeAdBlock:(() -> Void)?
///广
func configureSreachNativeAd(rootController vc:UIViewController) {
searchViewController = vc
}
///广
func loadSearchNativeAd() {
guard openAdStatus, internalAdStatus else {return}
guard let vc = searchViewController else {return}
//
let multipleAdOptions = GADMultipleAdsAdLoaderOptions()
//使
multipleAdOptions.numberOfAds = 1
//
let imageAdOptions = GADNativeAdImageAdLoaderOptions()
imageAdOptions.shouldRequestMultipleImages = false
//
let videoAdOptions = GADVideoOptions()
videoAdOptions.startMuted = true
if let first = SearchNATIVEID.first, first.type == .Native {
MP_AnalyticsManager.shared.result_ads_chanceAction()
searchAdLoader = GADAdLoader(adUnitID: first.identifier, rootViewController: vc, adTypes: [.native], options: [multipleAdOptions, imageAdOptions, videoAdOptions])
searchAdLoader?.delegate = self
let request = GADRequest()
searchAdLoader?.load(request)
}
}
///广
func layoutSearchNativeAd(in containerView: UIView) {
guard openAdStatus, internalAdStatus else {return}
MP_ADSimpleManager.shared.isAdMuted()
containerView.subviews.forEach { item in
item.removeFromSuperview()
}
searchNativeAdView = nil
//广
guard let templateView = (Bundle.main.loadNibNamed("GADTSmallTemplateView", owner: nil, options: nil)?.first as? GADTTemplateView), let nativeAd = searchNativeAd, refreshSearchDate(expirationSearchDate) else {
//
loadSearchNativeAd()
return
}
searchNativeAdView = templateView
nativeAd.delegate = self
containerView.addSubview(templateView)
templateView.snp.makeConstraints { make in
make.top.bottom.equalToSuperview()
make.left.equalToSuperview().offset(16*width)
make.right.equalToSuperview().offset(-16*width)
}
//choiveView
let customRect = CGRect(x: containerView.frame.width-(16*width)-25, y: 0, width: 25, height: 25)
let customAdChoicesView = GADAdChoicesView(frame: customRect)
templateView.addSubview(customAdChoicesView)
templateView.adChoicesView = customAdChoicesView
containerView.snp.updateConstraints { make in
make.height.equalTo(125)
}
templateView.nativeAd = nativeAd
nativeAd.paidEventHandler = { adValue in
MP_AnalyticsManager.shared.result_ads_showAction(nativeAd.responseInfo, adValue: adValue)
}
// 60 广
displaySearchTimer?.invalidate()
displaySearchTimer = Timer.scheduledTimer(withTimeInterval: 60, repeats: false) { [weak self] _ in
self?.loadSearchNativeAd()
}
}
///
private func refreshSearchDate(_ date:Date?) -> Bool {
guard let date = date else {return false}
return Date().timeIntervalSince(date) < refreshSearchTimes
}
//广
func loadSearchInterstitialAd(_ level:Int = 0, completion: @escaping (Bool) -> Void) {
guard openAdStatus, internalAdStatus else {return}
// 广广
if isLoadingSearchInterstitialAd || isSearchInterstitialAdAvailable() {
// 广广
completion(false)
return
}
guard SearchINSERTID.isEmpty == false else {
MP_AnalyticsManager.shared.search_ads_showFailureAction("No IDs")
//
reloadAdMobIDs()
completion(false)
return
}
guard level < (SearchINSERTID.count) else {
print("搜索插页广告组已经全部加载失败,停止继续加载")
MP_AnalyticsManager.shared.search_ads_loadFailureAction("No Ads Fill")
DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
[weak self] in
self?.loadSearchInterstitialAd { status in
if status {
print("重新加载搜索插页广告")
}else {
print("加载搜索插页广告失败")
}
}
}
return
}
isLoadingSearchInterstitialAd = true
let item = SearchINSERTID[level]
let request = GADRequest()
MP_ADSimpleManager.shared.isAdSounded()
//广
GADInterstitialAd.load(withAdUnitID: item.identifier, request: request) { ad, error in
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
if let error = error {
print("加载搜索插页广告失败,失败原因: \(error.localizedDescription)已下调广告ID等级重新加载")
MP_AnalyticsManager.shared.search_ads_loadFailureAction(error.localizedDescription)
self.isLoadingSearchInterstitialAd = false
loadSearchInterstitialAd(level+1, completion: completion)
} else {
self.searchInterstitialAd = ad
self.isLoadingSearchInterstitialAd = false
//
self.searchInterstitialAd?.fullScreenContentDelegate = self
//
self.loadSearchInterstitialAdTime = Date()
completion(true)
}
}
}
}
///广
func showSearchInterstitialAdIfAvailable(completion:((GADInterstitialAd) -> Void)?) {
guard openAdStatus, internalAdStatus else {return}
// 广广广
guard !interstitialSwitch, !isShowingSearchInterstitialAd, retrieveIntermediaryOpen() else { return }
//
if let date = interstitialDate {
if isShowInterstitialADAvailable(date) == false {
//
print("距上一次展示插页广告时长未超过要求,此次插页广告展示滞后")
return
}
}
// 广广
if !isSearchInterstitialAdAvailable() {
loadSearchInterstitialAd { [weak self] success in
guard let self = self else { return }
if success {
self.showSearchInterstitialAdIfAvailable(completion: completion)
}
}
//广
showGlobalInterstitialAdIfAvailable(completion: nil)
return
}
MP_AnalyticsManager.shared.search_ads_chanceAction()
//广
if let ad = searchInterstitialAd {
//
if let block = completion {
block(ad)
}else {
isShowingSearchInterstitialAd = true
interstitialSwitch = true
ad.present(fromRootViewController: nil)
}
}else {
MP_AnalyticsManager.shared.search_ads_showFailureAction("Ad loading failed")
}
}
//广
func isSearchInterstitialAdAvailable() -> Bool {
return searchInterstitialAd != nil && wasAdexpirationTime(loadSearchInterstitialAdTime)
}
//MARK: -
//广ID
private var PlayerINSERTID:[MPPositive_AdItemModel] = []
///广
var playInterstitialAd:GADInterstitialAd?
///广
private var isLoadingPlayInterstitialAd:Bool = false
///广
var isShowingPlayInterstitialAd:Bool = false
///
private var loadPlayInterstitialAdTime:Date?
///广
var completePlayInterstitialAdBlock:(() -> Void)?
//广
func loadPlayInterstitialAd(_ level:Int = 0, completion: @escaping (Bool) -> Void) {
guard openAdStatus, internalAdStatus else {
completion(false)
return
}
// 广广
if isLoadingPlayInterstitialAd || isPlayInterstitialAdAvailable() {
// 广广
completion(false)
return
}
guard PlayerINSERTID.isEmpty == false else {
MP_AnalyticsManager.shared.play_ads_showFailureAction("No IDs")
//
reloadAdMobIDs()
completion(false)
return
}
guard level < (PlayerINSERTID.count) else {
print("播放插页广告组已经全部加载失败,停止继续加载")
MP_AnalyticsManager.shared.play_ads_loadFailureAction("No Ads Fill")
DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
[weak self] in
self?.loadPlayInterstitialAd { status in
if status {
print("重新加载播放插页广告")
}else {
print("加载播放插页广告失败")
}
}
}
return
}
isLoadingPlayInterstitialAd = true
let item = PlayerINSERTID[level]
let request = GADRequest()
MP_ADSimpleManager.shared.isAdSounded()
//广
GADInterstitialAd.load(withAdUnitID: item.identifier, request: request) { ad, error in
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
if let error = error {
print("加载播放插页广告失败,失败原因: \(error.localizedDescription)已下调广告ID等级重新加载")
MP_AnalyticsManager.shared.play_ads_loadFailureAction(error.localizedDescription)
self.isLoadingPlayInterstitialAd = false
loadPlayInterstitialAd(level+1, completion: completion)
} else {
self.playInterstitialAd = ad
self.isLoadingPlayInterstitialAd = false
//
self.playInterstitialAd?.fullScreenContentDelegate = self
//
self.loadPlayInterstitialAdTime = Date()
completion(true)
}
}
}
}
///广
func showPlayInterstitialAdIfAvailable(completion:((GADInterstitialAd?) -> Void)?) {
guard openAdStatus, internalAdStatus else {
completion?(nil)
return
}
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
completion?(nil)
return
}
// 广广广
guard !interstitialSwitch, !isShowingPlayInterstitialAd, retrieveIntermediaryOpen() else {
completion?(nil)
return
}
//
if let date = interstitialDate {
if isShowInterstitialADAvailable(date) == false {
//
print("距上一次展示插页广告时长未超过要求,此次插页广告展示滞后")
completion?(nil)
return
}
}
// 广广
if !isPlayInterstitialAdAvailable() {
loadPlayInterstitialAd{ [weak self] success in
guard let self = self else { return }
if success {
print("播放广告已加载")
}
}
completion?(nil)
return
}
MP_AnalyticsManager.shared.play_ads_chanceAction()
//广
if let ad = playInterstitialAd {
//
if let block = completion {
block(ad)
}else {
isShowingPlayInterstitialAd = true
interstitialSwitch = true
ad.present(fromRootViewController: nil)
}
}else {
MP_AnalyticsManager.shared.play_ads_showFailureAction("Ad loading failed")
completion?(nil)
}
}
//广
func isPlayInterstitialAdAvailable() -> Bool {
return playInterstitialAd != nil && wasAdexpirationTime(loadPlayInterstitialAdTime)
}
//MARK: -
//广ID
private var SwitchINSERTID:[MPPositive_AdItemModel] = []
///广
var switchInterstitialAd:GADInterstitialAd?
///广
private var isLoadingSwitchInterstitialAd:Bool = false
///广
var isShowingSwitchInterstitialAd:Bool = false
///
private var loadSwitchInterstitialAdTime:Date?
///广
var completeSwitchInterstitialAdBlock:(() -> Void)?
//广
func loadSwitchInterstitialAd(_ level:Int = 0, completion: @escaping (Bool) -> Void) {
guard openAdStatus, internalAdStatus else {
completion(false)
return
}
// 广广
if isLoadingSwitchInterstitialAd || isSwitchInterstitialAdAvailable() {
// 广广
completion(false)
return
}
guard SwitchINSERTID.isEmpty == false else {
MP_AnalyticsManager.shared.cut_ads_showFailureAction("No IDs")
//
reloadAdMobIDs()
completion(false)
return
}
guard level < (SwitchINSERTID.count) else {
print("切歌插页广告组已经全部加载失败,停止继续加载")
MP_AnalyticsManager.shared.cut_ads_loadFailureAction("No Ads Fill")
DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
[weak self] in
self?.loadSwitchInterstitialAd { status in
if status {
print("重新加载切歌插页广告")
}else {
print("加载切歌插页广告失败")
}
}
}
return
}
isLoadingSwitchInterstitialAd = true
let item = SwitchINSERTID[level]
let request = GADRequest()
//广
GADInterstitialAd.load(withAdUnitID: item.identifier, request: request) { ad, error in
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
if let error = error {
print("加载切歌插页广告失败,失败原因: \(error.localizedDescription)已下调广告ID等级重新加载")
MP_AnalyticsManager.shared.cut_ads_loadFailureAction(error.localizedDescription)
self.isLoadingSwitchInterstitialAd = false
loadSwitchInterstitialAd(level+1, completion: completion)
} else {
self.switchInterstitialAd = ad
self.isLoadingSwitchInterstitialAd = false
//
self.switchInterstitialAd?.fullScreenContentDelegate = self
//
self.loadSwitchInterstitialAdTime = Date()
completion(true)
}
}
}
}
///广
func showSwitchInterstitialAdIfAvailable(completion:((GADInterstitialAd) -> Void)?) {
guard openAdStatus, internalAdStatus else {
return
}
// 广广广
guard !interstitialSwitch, !isShowingSwitchInterstitialAd, retrieveIntermediaryOpen() else { return }
//
if let date = interstitialDate {
if isShowInterstitialADAvailable(date) == false {
//
print("距上一次展示插页广告时长未超过要求,此次插页广告展示滞后")
return
}
}
// 广广
if !isSwitchInterstitialAdAvailable() {
loadSwitchInterstitialAd{ [weak self] success in
guard let self = self else { return }
if success {
self.showSwitchInterstitialAdIfAvailable(completion: completion)
}
}
//广
showGlobalInterstitialAdIfAvailable(completion: nil)
return
}
MP_AnalyticsManager.shared.cut_ads_chanceAction()
//广
if let ad = switchInterstitialAd {
//
if let block = completion {
block(ad)
}else {
isShowingSwitchInterstitialAd = true
interstitialSwitch = true
ad.present(fromRootViewController: nil)
}
}else {
MP_AnalyticsManager.shared.cut_ads_showFailureAction("Ad loading failed")
}
}
//广
func isSwitchInterstitialAdAvailable() -> Bool {
return switchInterstitialAd != nil && wasAdexpirationTime(loadSwitchInterstitialAdTime)
}
//MARK: -
//广ID
private var LoadINSERTID:[MPPositive_AdItemModel] = []
///广
var loadInterstitialAd:GADInterstitialAd?
///广
private var isLoadingLoadInterstitialAd:Bool = false
///广
var isShowingLoadInterstitialAd:Bool = false
///
private var loadLoadInterstitialAdTime:Date?
///广
var completeLoadInterstitialAdBlock:(() -> Void)?
//广
func loadLoadInterstitialAd(_ level:Int = 0, completion: @escaping (Bool) -> Void) {
guard openAdStatus, internalAdStatus else {
completion(false)
return
}
// 广广
if isLoadingLoadInterstitialAd || isLoadInterstitialAdAvailable() {
// 广广
completion(false)
return
}
guard LoadINSERTID.isEmpty == false else {
MP_AnalyticsManager.shared.dl_ads_showFailureAction("No IDs")
//
reloadAdMobIDs()
completion(false)
return
}
guard level < (LoadINSERTID.count) else {
print("下载插页广告组已经全部加载失败,停止继续加载")
MP_AnalyticsManager.shared.dl_ads_loadFailureAction("No Ads Fill")
DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
[weak self] in
self?.loadLoadInterstitialAd { status in
if status {
print("重新加载下载插页广告")
}else {
print("加载下载插页广告失败")
}
}
}
return
}
isLoadingLoadInterstitialAd = true
let item = LoadINSERTID[level]
let request = GADRequest()
//广
GADInterstitialAd.load(withAdUnitID: item.identifier, request: request) { ad, error in
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
if let error = error {
print("加载下载插页广告失败,失败原因: \(error.localizedDescription)已下调广告ID等级重新加载")
MP_AnalyticsManager.shared.dl_ads_loadFailureAction(error.localizedDescription)
self.isLoadingLoadInterstitialAd = false
loadLoadInterstitialAd(level+1, completion: completion)
} else {
self.loadInterstitialAd = ad
self.isLoadingLoadInterstitialAd = false
//
self.loadInterstitialAd?.fullScreenContentDelegate = self
//
self.loadLoadInterstitialAdTime = Date()
completion(true)
}
}
}
}
///广
func showLoadInterstitialAdIfAvailable(completion:((GADInterstitialAd) -> Void)?) {
guard openAdStatus, internalAdStatus else {
return
}
// 广广广
guard !interstitialSwitch, !isShowingLoadInterstitialAd, retrieveIntermediaryOpen() else { return }
//
if let date = interstitialDate {
if isShowInterstitialADAvailable(date) == false {
//
print("距上一次展示插页广告时长未超过要求,此次插页广告展示滞后")
return
}
}
// 广广
if !isLoadInterstitialAdAvailable() {
loadLoadInterstitialAd{ [weak self] success in
guard let self = self else { return }
if success {
self.showLoadInterstitialAdIfAvailable(completion: completion)
}
}
//广
showGlobalInterstitialAdIfAvailable(completion: nil)
return
}
MP_AnalyticsManager.shared.dl_ads_chanceAction()
//广
if let ad = loadInterstitialAd {
//
if let block = completion {
block(ad)
}else {
isShowingLoadInterstitialAd = true
interstitialSwitch = true
ad.present(fromRootViewController: nil)
}
}else {
MP_AnalyticsManager.shared.dl_ads_showFailureAction("Ad loading failed")
}
}
//广
func isLoadInterstitialAdAvailable() -> Bool {
return loadInterstitialAd != nil && wasAdexpirationTime(loadLoadInterstitialAdTime)
}
//MARK: -
//ID
private var LibraryINSERTID:[MPPositive_AdItemModel] = []
//ID
private var LibraryNATIVEID:[MPPositive_AdItemModel] = []
///广
private var libraryInterstitialAd:GADInterstitialAd?
///广
private var isLoadingLibraryInterstitialAd:Bool = false
///广
var isShowingLibraryInterstitialAd:Bool = false
///
private var loadLibraryInterstitialAdTime:Date?
///广
var completeLibraryInterstitialAdBlock:(() -> Void)?
///广
var libraryAdLoader:GADAdLoader?
///广
var libraryNativeAds:[GADNativeAd]?
///广
var libraryNativeAdFirstView:GADNativeAdView?
///广
var libraryNativeAdSecondView:GADNativeAdView?
///
var refreshLibraryTimes:TimeInterval = 3600
///
var displayLibraryTimer:Timer?
///
var expirationLibraryDate:Date?
///
var libraryViewController:UIViewController?
///
var onLibraryNativeAdBlock:(() -> Void)?
///广
func configureLibraryNativeAd(rootController vc:UIViewController) {
guard openAdStatus, internalAdStatus else {
return
}
if libraryViewController == nil {
libraryViewController = vc
}
}
///广
func loadLibraryNativeAd() {
guard openAdStatus, internalAdStatus else {return}
guard let vc = libraryViewController, libraryNativeAds == nil else {return}
//
let multipleAdOptions = GADMultipleAdsAdLoaderOptions()
//使
multipleAdOptions.numberOfAds = 2
//
let imageAdOptions = GADNativeAdImageAdLoaderOptions()
imageAdOptions.shouldRequestMultipleImages = false
//
let videoAdOptions = GADVideoOptions()
videoAdOptions.startMuted = true
if let first = LibraryNATIVEID.first, first.type == .Native {
libraryAdLoader = GADAdLoader(adUnitID: first.identifier, rootViewController: vc, adTypes: [.native], options: [multipleAdOptions,imageAdOptions,videoAdOptions])
libraryAdLoader?.delegate = self
let request = GADRequest()
//广-Mintegral,Pangle,Liftoff,ironsource
libraryAdLoader?.load(request)
libraryNativeAds = []
}
}
///广
func layoutLibraryNativeAd(in containerView: UIView, index:Int, completion:(() -> Void)? = nil) {
guard openAdStatus, internalAdStatus else {return}
MP_ADSimpleManager.shared.isAdMuted()
containerView.subviews.forEach { item in
item.removeFromSuperview()
}
if index == 0 {
MP_AnalyticsManager.shared.lbr_ads_chanceAction()
//
libraryNativeAdFirstView = nil
//广
guard let templateView = (Bundle.main.loadNibNamed("GADTSmallTemplateView", owner: nil, options: nil)?.first as? GADTTemplateView), let nativeAds = libraryNativeAds, nativeAds.count == 2, let nativeAd = nativeAds.first, refreshLibraryDate(expirationLibraryDate) else {
//
loadLibraryNativeAd()
return
}
libraryNativeAdFirstView = templateView
nativeAd.delegate = self
containerView.addSubview(templateView)
templateView.snp.makeConstraints { make in
make.top.bottom.equalToSuperview()
make.left.equalToSuperview().offset(16*width)
make.right.equalToSuperview().offset(-16*width)
}
//choiveView
let customRect = CGRect(x: containerView.frame.width-(16*width)-25, y: 0, width: 25, height: 25)
let customAdChoicesView = GADAdChoicesView(frame: customRect)
templateView.addSubview(customAdChoicesView)
templateView.adChoicesView = customAdChoicesView
templateView.nativeAd = nativeAd
nativeAd.paidEventHandler = { adValue in
MP_AnalyticsManager.shared.lbr_ads_showAction(nativeAd.responseInfo, adValue: adValue)
}
}else {
MP_AnalyticsManager.shared.list_ads_chanceAction()
//
libraryNativeAdSecondView = nil
//广
guard let templateView = (Bundle.main.loadNibNamed("GADTSmallTemplateView", owner: nil, options: nil)?.first as? GADTTemplateView), let nativeAds = libraryNativeAds, nativeAds.count == 2, let nativeAd = nativeAds.last, refreshLibraryDate(expirationLibraryDate) else {
//
loadLibraryNativeAd()
return
}
libraryNativeAdSecondView = templateView
nativeAd.delegate = self
containerView.addSubview(templateView)
templateView.snp.makeConstraints { make in
make.top.bottom.equalToSuperview()
make.left.equalToSuperview().offset(16*width)
make.right.equalToSuperview().offset(-16*width)
}
//choiveView
let customRect = CGRect(x: containerView.frame.width-(16*width)-25, y: 0, width: 25, height: 25)
let customAdChoicesView = GADAdChoicesView(frame: customRect)
templateView.addSubview(customAdChoicesView)
templateView.adChoicesView = customAdChoicesView
templateView.nativeAd = nativeAd
nativeAd.paidEventHandler = { adValue in
MP_AnalyticsManager.shared.list_ads_showAction(nativeAd.responseInfo, adValue: adValue)
}
}
DispatchQueue.main.async {
[weak self] in
containerView.snp.updateConstraints { make in
make.height.equalTo(125)
}
completion?()
}
// 60 广
displayLibraryTimer?.invalidate()
displayLibraryTimer = Timer.scheduledTimer(withTimeInterval: 60, repeats: false) { [weak self] _ in
self?.loadLibraryNativeAd()
}
}
///
private func refreshLibraryDate(_ date:Date?) -> Bool {
guard let date = date else {return false}
return Date().timeIntervalSince(date) < refreshLibraryTimes
}
//广
func loadLibraryInterstitialAd(_ level:Int = 0, completion: @escaping (Bool) -> Void) {
guard openAdStatus, internalAdStatus else {
completion(false)
return
}
// 广广
if isLoadingLibraryInterstitialAd || isLibraryInterstitialAdAvailable() {
// 广广
completion(false)
return
}
guard LibraryINSERTID.isEmpty == false else {
MP_AnalyticsManager.shared.listclk_ads_showFailureAction("No IDs")
//
reloadAdMobIDs()
completion(false)
return
}
guard level < (LibraryINSERTID.count) else {
print("曲库插页广告组已经全部加载失败,停止继续加载")
MP_AnalyticsManager.shared.listclk_ads_loadFailureAction("No Ads Fill")
DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
[weak self] in
self?.loadLibraryInterstitialAd { status in
if status {
print("重新加载曲库插页广告")
}else {
print("加载曲库插页广告失败")
}
}
}
return
}
isLoadingLibraryInterstitialAd = true
let item = LibraryINSERTID[level]
let request = GADRequest()
MP_ADSimpleManager.shared.isAdSounded()
//广
GADInterstitialAd.load(withAdUnitID: item.identifier, request: request) { ad, error in
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
if let error = error {
print("加载曲库插页广告失败,失败原因: \(error.localizedDescription)已下调广告ID等级重新加载")
MP_AnalyticsManager.shared.listclk_ads_loadFailureAction(error.localizedDescription)
self.isLoadingLibraryInterstitialAd = false
loadLibraryInterstitialAd(level+1, completion: completion)
} else {
self.libraryInterstitialAd = ad
self.isLoadingLibraryInterstitialAd = false
//
self.libraryInterstitialAd?.fullScreenContentDelegate = self
//
self.loadLibraryInterstitialAdTime = Date()
completion(true)
}
}
}
}
///广
func showLibraryInterstitialAdIfAvailable(completion:((GADInterstitialAd) -> Void)?) {
guard openAdStatus, internalAdStatus else {
return
}
// 广广广
guard !interstitialSwitch, !isShowingLibraryInterstitialAd, retrieveIntermediaryOpen() else { return }
//
if let date = interstitialDate {
if isShowInterstitialADAvailable(date) == false {
//
print("距上一次展示插页广告时长未超过要求,此次插页广告展示滞后")
return
}
}
// 广广
if !isLibraryInterstitialAdAvailable() {
loadLibraryInterstitialAd { [weak self] success in
guard let self = self else { return }
if success {
self.showLibraryInterstitialAdIfAvailable(completion: completion)
}
}
//广
showGlobalInterstitialAdIfAvailable(completion: nil)
return
}
MP_AnalyticsManager.shared.listclk_ads_chanceAction()
//广
if let ad = libraryInterstitialAd {
//
if let block = completion {
block(ad)
}else {
isShowingLibraryInterstitialAd = true
interstitialSwitch = true
ad.present(fromRootViewController: nil)
}
}else {
MP_AnalyticsManager.shared.listclk_ads_showFailureAction("Ad loading failed")
}
}
//广
func isLibraryInterstitialAdAvailable() -> Bool {
return libraryInterstitialAd != nil && wasAdexpirationTime(loadLibraryInterstitialAdTime)
}
//MARK: -
//ID
private var GlobalINSERTID:[MPPositive_AdItemModel] = []
///广
private var globalInterstitialAd:GADInterstitialAd?
///广
private var isLoadingGlobalInterstitialAd:Bool = false
///广
var isShowingGlobalInterstitialAd:Bool = false
///
private var loadGlobalInterstitialAdTime:Date?
///广
var completeGlobalInterstitialAdBlock:(() -> Void)?
//广
func loadGlobalInterstitialAd(_ level:Int = 0, completion: @escaping (Bool) -> Void) {
guard openAdStatus, internalAdStatus else {
return
}
// 广广
if isLoadingGlobalInterstitialAd || isGlobalInterstitialAdAvailable() {
// 广广
completion(false)
return
}
guard level < (GlobalINSERTID.count) else {
print("全局插页广告组已经全部加载失败,停止继续加载")
completion(false)
return
}
isLoadingGlobalInterstitialAd = true
let item = GlobalINSERTID[level]
let request = GADRequest()
//广-Mintegral,Pangle,Liftoff,ironsource
// let mintegralExtra = GADMAdapterMintegralExtras()
// mintegralExtra.muteVideoAudio = true
// let appLovinExtra = GADMAdapterAppLovinExtras()
// appLovinExtra.muteAudio = true
// request.register(appLovinExtra)
// request.register(mintegralExtra)
//广
GADInterstitialAd.load(withAdUnitID: item.identifier, request: request) { ad, error in
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
if let error = error {
print("加载全局插页广告失败,失败原因: \(error.localizedDescription)已下调广告ID等级重新加载")
self.isLoadingGlobalInterstitialAd = false
loadGlobalInterstitialAd(level+1, completion: completion)
} else {
self.globalInterstitialAd = ad
self.isLoadingGlobalInterstitialAd = false
//
self.globalInterstitialAd?.fullScreenContentDelegate = self
//
self.loadGlobalInterstitialAdTime = Date()
completion(true)
}
}
}
}
///广
func showGlobalInterstitialAdIfAvailable(completion:((GADInterstitialAd?) -> Void)?) {
guard openAdStatus, internalAdStatus else {
return
}
// 广广广
guard !interstitialSwitch, !isShowingGlobalInterstitialAd, retrieveIntermediaryOpen() else { return }
//
if let date = interstitialDate {
if isShowInterstitialADAvailable(date) == false {
//
print("距上一次展示插页广告时长未超过要求,此次插页广告展示滞后")
return
}
}
// 广广
if !isGlobalInterstitialAdAvailable() {
loadGlobalInterstitialAd { [weak self] success in
guard let self = self else { return }
if success {
self.showGlobalInterstitialAdIfAvailable(completion: completion)
}else {
completion?(nil)
}
}
return
}
//广
if let ad = globalInterstitialAd {
//
if let block = completion {
block(ad)
}else {
isShowingGlobalInterstitialAd = true
interstitialSwitch = true
ad.present(fromRootViewController: nil)
}
}
}
//广
func isGlobalInterstitialAdAvailable() -> Bool {
return globalInterstitialAd != nil && wasAdexpirationTime(loadGlobalInterstitialAdTime)
}
//MARK: - 广 GADAudioVideoManagerDelegate
//广
func audioVideoManagerWillPlayVideo(_ audioVideoManager: GADAudioVideoManager) {
print("广告将会播放视频")
}
//广
func audioVideoManagerDidPauseAllVideo(_ audioVideoManager: GADAudioVideoManager) {
print("广告暂停播放视频")
}
//广
func audioVideoManagerWillPlayAudio(_ audioVideoManager: GADAudioVideoManager) {
accessAppdelegate.setAudioActive()
}
//广
func audioVideoManagerDidStopPlayingAudio(_ audioVideoManager: GADAudioVideoManager) {
DispatchQueue.main.asyncAfter(deadline: .now()+0.1) {
accessAppdelegate.setAudioActive()
}
}
//MARK: - 广 GADFullScreenContentDelegate
//广
func adWillPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) {
if ad === appOpenAd || ad === appInterstitialAd {//广
print("当前展示的广告是开屏广告广告ID--\(appOpenAd != nil ? (appOpenAd?.adUnitID ?? ""):(appInterstitialAd?.adUnitID ?? ""))")
//
if OpenICEID.contains(where: {($0.identifier == (appOpenAd?.adUnitID ?? "") || $0.identifier == (appInterstitialAd?.adUnitID ?? ""))}) {
//,
if let openAd = appOpenAd {
if MP_AnalyticsManager.shared.infoFromAdMobSource(openAd.responseInfo) {
//广
openAd.paidEventHandler = { adValue in
MP_AnalyticsManager.shared.cold_ads_showSuccessAction(openAd.responseInfo, adValue: adValue)
}
}else {
MP_AnalyticsManager.shared.cold_ads_showSuccessAction(openAd.responseInfo, adValue: .init())
}
}else if let openAd = appInterstitialAd {
if MP_AnalyticsManager.shared.infoFromAdMobSource(openAd.responseInfo) {
//广
openAd.paidEventHandler = { adValue in
MP_AnalyticsManager.shared.cold_ads_showSuccessAction(openAd.responseInfo, adValue: adValue)
}
}else {
MP_AnalyticsManager.shared.cold_ads_showSuccessAction(openAd.responseInfo, adValue: .init())
}
}
}else if OpenHOSTID.contains(where: {($0.identifier == (appOpenAd?.adUnitID ?? "") || $0.identifier == (appInterstitialAd?.adUnitID ?? ""))}) {
//,
if let openAd = appOpenAd {
if MP_AnalyticsManager.shared.infoFromAdMobSource(openAd.responseInfo) {
//广
openAd.paidEventHandler = { adValue in
MP_AnalyticsManager.shared.hot_ads_showSuccessAction(openAd.responseInfo, adValue: adValue)
}
}else {
MP_AnalyticsManager.shared.hot_ads_showSuccessAction(openAd.responseInfo, adValue: .init())
}
}else if let openAd = appInterstitialAd {
if MP_AnalyticsManager.shared.infoFromAdMobSource(openAd.responseInfo) {
//广
openAd.paidEventHandler = { adValue in
MP_AnalyticsManager.shared.hot_ads_showSuccessAction(openAd.responseInfo, adValue: adValue)
}
}else {
MP_AnalyticsManager.shared.hot_ads_showSuccessAction(openAd.responseInfo, adValue: .init())
}
}
}
}else if ad === searchInterstitialAd {//广
print("当前展示的广告是搜索插页广告广告ID--\(searchInterstitialAd?.adUnitID ?? "")")
if MP_AnalyticsManager.shared.infoFromAdMobSource(searchInterstitialAd?.responseInfo) {
searchInterstitialAd?.paidEventHandler = { adValue in
if let response = self.searchInterstitialAd?.responseInfo {
MP_AnalyticsManager.shared.search_ads_showSuccessAction(response, adValue: adValue)
}
}
}else {
if let response = self.searchInterstitialAd?.responseInfo {
MP_AnalyticsManager.shared.search_ads_showSuccessAction(response, adValue: .init())
}
}
}else if ad === playInterstitialAd {//广
print("当前展示的广告是播放插页广告广告ID--\(playInterstitialAd?.adUnitID ?? "")")
if MP_AnalyticsManager.shared.infoFromAdMobSource(playInterstitialAd?.responseInfo) {
playInterstitialAd?.paidEventHandler = { adValue in
if let response = self.playInterstitialAd?.responseInfo {
MP_AnalyticsManager.shared.play_ads_showSuccessAction(response, adValue: adValue)
}
}
}else {
if let response = self.playInterstitialAd?.responseInfo {
MP_AnalyticsManager.shared.play_ads_showSuccessAction(response, adValue: .init())
}
}
}else if ad === switchInterstitialAd {//广
print("当前展示的广告是切歌插页广告广告ID--\(switchInterstitialAd?.adUnitID ?? "")")
if MP_AnalyticsManager.shared.infoFromAdMobSource(switchInterstitialAd?.responseInfo) {
switchInterstitialAd?.paidEventHandler = { adValue in
if let response = self.switchInterstitialAd?.responseInfo {
MP_AnalyticsManager.shared.cut_ads_showSuccessAction(response, adValue: adValue)
}
}
}else {
if let response = self.switchInterstitialAd?.responseInfo {
MP_AnalyticsManager.shared.cut_ads_showSuccessAction(response, adValue: .init())
}
}
}else if ad === loadInterstitialAd {//广
print("当前展示的广告是下载插页广告广告ID--\(loadInterstitialAd?.adUnitID ?? "")")
if MP_AnalyticsManager.shared.infoFromAdMobSource(switchInterstitialAd?.responseInfo) {
loadInterstitialAd?.paidEventHandler = { adValue in
if let response = self.loadInterstitialAd?.responseInfo {
MP_AnalyticsManager.shared.dl_ads_showSuccessAction(response, adValue: adValue)
}
}
}else {
if let response = self.loadInterstitialAd?.responseInfo {
MP_AnalyticsManager.shared.dl_ads_showSuccessAction(response, adValue: .init())
}
}
}else if ad === libraryInterstitialAd {//广
print("当前展示的广告是曲库插页广告广告ID--\(libraryInterstitialAd?.adUnitID ?? "")")
if MP_AnalyticsManager.shared.infoFromAdMobSource(switchInterstitialAd?.responseInfo) {
libraryInterstitialAd?.paidEventHandler = { adValue in
if let response = self.libraryInterstitialAd?.responseInfo {
MP_AnalyticsManager.shared.listclk_ads_showSuccessAction(response, adValue: adValue)
}
}
}else {
if let response = self.libraryInterstitialAd?.responseInfo {
MP_AnalyticsManager.shared.listclk_ads_showSuccessAction(response, adValue: .init())
}
}
}else if ad === globalInterstitialAd {//广
print("当前展示的广告是全局插页广告广告ID--\(globalInterstitialAd?.adUnitID ?? "")")
}
}
//广
func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
//广
interstitialDate = Date()
if ad === appOpenAd || ad === appInterstitialAd {//广
print("当前消失的广告是开屏广告广告ID--\(appOpenAd != nil ? (appOpenAd?.adUnitID ?? ""):(appInterstitialAd?.adUnitID ?? ""))")
//广
if completeOpenAdBlock != nil {
completeOpenAdBlock!()
}
}else if ad === searchInterstitialAd {//广
print("当前消失的广告是搜索插页广告广告ID--\(searchInterstitialAd?.adUnitID ?? "")")
//广
if completeSearchInterstitialAdBlock != nil {
completeSearchInterstitialAdBlock!()
}
}else if ad === playInterstitialAd {//广
print("当前消失的广告是播放插页广告广告ID--\(playInterstitialAd?.adUnitID ?? "")")
//广
if completePlayInterstitialAdBlock != nil {
completePlayInterstitialAdBlock!()
}
}else if ad === switchInterstitialAd {//广
print("当前消失的广告是切歌插页广告广告ID--\(switchInterstitialAd?.adUnitID ?? "")")
//广
if completeSwitchInterstitialAdBlock != nil {
completeSwitchInterstitialAdBlock!()
}
}else if ad === loadInterstitialAd {//广
print("当前消失的广告是下载插页广告广告ID--\(loadInterstitialAd?.adUnitID ?? "")")
//广
if completeLoadInterstitialAdBlock != nil {
completeLoadInterstitialAdBlock!()
}
}else if ad === libraryInterstitialAd {//广
print("当前消失的广告是曲库插页广告广告ID--\(libraryInterstitialAd?.adUnitID ?? "")")
//广
if completeLibraryInterstitialAdBlock != nil {
completeLibraryInterstitialAdBlock!()
}
}else if ad === globalInterstitialAd {///广
print("当前消失的广告是全局插页广告广告ID--\(globalInterstitialAd?.adUnitID ?? "")")
//广
if completeGlobalInterstitialAdBlock != nil {
completeGlobalInterstitialAdBlock!()
}
}
}
//广
func ad(_ ad: GADFullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) {
//广
interstitialDate = Date()
if ad === appOpenAd || ad === appInterstitialAd {//广
print("开屏广告展示时出错广告ID--\(appOpenAd != nil ? (appOpenAd?.adUnitID ?? ""):(appInterstitialAd?.adUnitID ?? "")),具体错误原因:\(error.localizedDescription)")
//
if OpenICEID.contains(where: {($0.identifier == (appOpenAd?.adUnitID ?? "") || $0.identifier == (appInterstitialAd?.adUnitID ?? ""))}) {
MP_AnalyticsManager.shared.cold_ads_showFailureAction(error.localizedDescription)
}else if OpenHOSTID.contains(where: {($0.identifier == (appOpenAd?.adUnitID ?? "") || $0.identifier == (appInterstitialAd?.adUnitID ?? ""))}) {
MP_AnalyticsManager.shared.hot_ads_showFailureAction(error.localizedDescription)
}
if completeOpenAdBlock != nil {
completeOpenAdBlock!()
}
}else if ad === searchInterstitialAd {//广
print("搜索插页广告展示时出错广告ID--\(searchInterstitialAd?.adUnitID ?? ""),具体错误原因:\(error.localizedDescription)")
MP_AnalyticsManager.shared.search_ads_showFailureAction(error.localizedDescription)
if completeSearchInterstitialAdBlock != nil {
completeSearchInterstitialAdBlock!()
}
}else if ad === playInterstitialAd {//广
print("播放插页广告展示时出错广告ID--\(playInterstitialAd?.adUnitID ?? ""),具体错误原因:\(error.localizedDescription)")
MP_AnalyticsManager.shared.play_ads_showFailureAction(error.localizedDescription)
//广
if completePlayInterstitialAdBlock != nil {
completePlayInterstitialAdBlock!()
}
}else if ad === switchInterstitialAd {//广
print("切歌插页广告展示时出错广告ID--\(switchInterstitialAd?.adUnitID ?? ""),具体错误原因:\(error.localizedDescription)")
MP_AnalyticsManager.shared.cut_ads_showFailureAction(error.localizedDescription)
//广
if completeSwitchInterstitialAdBlock != nil {
completeSwitchInterstitialAdBlock!()
}
}else if ad === loadInterstitialAd {//广
print("下载插页广告展示时出错广告ID--\(loadInterstitialAd?.adUnitID ?? ""),具体错误原因:\(error.localizedDescription)")
MP_AnalyticsManager.shared.dl_ads_showFailureAction(error.localizedDescription)
//广
if completeLoadInterstitialAdBlock != nil {
completeLoadInterstitialAdBlock!()
}
}else if ad === libraryInterstitialAd {//广
print("曲库插页广告展示时出错广告ID--\(libraryInterstitialAd?.adUnitID ?? ""),具体错误原因:\(error.localizedDescription)")
MP_AnalyticsManager.shared.listclk_ads_showFailureAction(error.localizedDescription)
if completeLibraryInterstitialAdBlock != nil {
completeLibraryInterstitialAdBlock!()
}
}else if ad === globalInterstitialAd {//广
print("全局插页广告展示时出错广告ID--\(globalInterstitialAd?.adUnitID ?? ""),具体错误原因:\(error.localizedDescription)")
if completeGlobalInterstitialAdBlock != nil {
completeGlobalInterstitialAdBlock!()
}
}
}
//MARK: - GADNativeAdLoaderDelegate
// 广
func adLoader(_ adLoader: GADAdLoader, didReceive nativeAd: GADNativeAd) {
if nativeAd.mediaContent.hasVideoContent {
// //广
// nativeAd.mediaContent.videoController.setMute(true)
// nativeAd.mediaContent.videoController.delegate = self
}
if adLoader == searchAdLoader {//广
print("搜索原生已经加载完毕")
self.searchNativeAd = nativeAd
self.expirationSearchDate = Date()
if let block = self.onSearchNativeAdBlock {
block()
}
}else if adLoader == libraryAdLoader {//广
print("曲库原生已经加载完毕")
guard libraryNativeAds != nil else {
return
}
if (libraryNativeAds?.count ?? 0) < 2 {
//广
libraryNativeAds?.append(nativeAd)
}else {
//广
libraryNativeAds = []
libraryNativeAds?.append(nativeAd)
}
//
if (libraryNativeAds?.count ?? 0) == 2 {
self.expirationLibraryDate = Date()
if let block = self.onLibraryNativeAdBlock {
block()
}
}
}
}
// 广
func adLoader(_ adLoader: GADAdLoader, didFailToReceiveAdWithError error: any Error) {
if adLoader == searchAdLoader {//广
print("加载搜索原生广告发生错误,错误详情:\(error.localizedDescription)")
DispatchQueue.main.asyncAfter(deadline: .now() + 300) {
[weak self] in
guard let self = self else {return}
loadSearchNativeAd()
}
}else if adLoader == libraryAdLoader {//广
print("加载曲库原生广告发生错误,错误详情:\(error.localizedDescription)")
DispatchQueue.main.asyncAfter(deadline: .now() + 300) {
[weak self] in
guard let self = self else {return}
loadLibraryNativeAd()
}
}
}
// 广
func nativeAdDidRecordImpression(_ nativeAd: GADNativeAd) {
print("原生广告刷新")
}
// 广
func nativeAdDidRecordClick(_ nativeAd: GADNativeAd) {
print("原生广告被点击")
}
// 广
func nativeAdWillPresentScreen(_ nativeAd: GADNativeAd) {
print("原生广告将弹出一个新视图")
}
// 广
func nativeAdWillDismissScreen(_ nativeAd: GADNativeAd) {
print("原生广告视图将要关闭")
}
// 广
func nativeAdDidDismissScreen(_ nativeAd: GADNativeAd) {
print("原生广告视图已经关闭")
}
// 广
func nativeAdWillLeaveApplication(_ nativeAd: GADNativeAd) {
}
//MARK: - GADVideoControllerDelegate
// 广
func videoControllerDidPlayVideo(_ videoController: GADVideoController) {
//
}
// 广
func videoControllerDidPauseVideo(_ videoController: GADVideoController) {
//
}
// 广
func videoControllerDidEndVideoPlayback(_ videoController: GADVideoController) {
//
}
}