Music_Player3/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_AdMobManager.swift
2024-07-05 17:25:49 +08:00

1430 lines
60 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
///广
class MP_AdMobManager: NSObject, GADFullScreenContentDelegate, GADNativeAdLoaderDelegate, GADNativeAdDelegate {
static let shared = MP_AdMobManager()
private let sharedInstance = GADMobileAds.sharedInstance()
///广
private var openAdStatus:Bool = true
///广(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
MP_PlayerManager.shared.isAdLate = self?.interstitialSwitch
MPSideA_MediaCenterManager.shared.isAdLate = self?.interstitialSwitch
}
}
}
///广
var interstitialDate:Date?
///广(40)
private var interstitialDuration:TimeInterval = 40
///
func setInterstitialSwitch(_ status:Bool) {
interstitialSwitch = status
}
///
func getInterstitialSwitch() -> Bool {
return interstitialSwitch
}
///广
func setInterstitialDuration(_ duration:TimeInterval?) {
self.interstitialDuration = duration ?? 30
}
///广
private func isShowInterstitialADAvailable(_ date:Date) -> Bool {
return Date().timeIntervalSince(date) > interstitialDuration
}
private override init() {
super.init()
reloadAdMobIDs()
//广
completeOpenAdBlock = {
[weak self] in
guard let self = self, interstitialSwitch == true else {return}
//广
appOpenAd = nil
isShowingOpenAd = false
loadOpenAdTime = nil
//广
interstitialSwitch = false
//广
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
//广
DispatchQueue.main.asyncAfter(deadline: .now() + 20) {
[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
//广
DispatchQueue.main.asyncAfter(deadline: .now() + 20) {
[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
//广
DispatchQueue.main.asyncAfter(deadline: .now() + 20) {
[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
//广
DispatchQueue.main.asyncAfter(deadline: .now() + 20) {
[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
//广
DispatchQueue.main.asyncAfter(deadline: .now() + 20) {
[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
//广
DispatchQueue.main.asyncAfter(deadline: .now() + 20) {
[weak self] in
self?.loadGlobalInterstitialAd { status in
if status {
print("成功加载全局插页广告")
}else {
print("全局插页广告加载失败")
}
}
}
}
}
///ID
func reloadAdMobIDs() {
//广ID
if let str = UserDefaults.standard.string(forKey: "OpenICEID") {
print("成功提取ID")
OpenICEID = str
}
if let str = UserDefaults.standard.string(forKey: "OpenHOSTID") {
OpenHOSTID = str
}
if let str = UserDefaults.standard.string(forKey: "SearchINSERTID") {
SearchINSERTID = str
}
if let str = UserDefaults.standard.string(forKey: "SearchNATIVEID") {
SearchNATIVEID = str
}
if let str = UserDefaults.standard.string(forKey: "PlayerINSERTID") {
PlayerINSERTID = str
}
if let str = UserDefaults.standard.string(forKey: "SwitchINSERTID") {
SwitchINSERTID = str
}
if let str = UserDefaults.standard.string(forKey: "LoadINSERTID") {
LoadINSERTID = str
}
if let str = UserDefaults.standard.string(forKey: "LibraryINSERTID") {
LibraryINSERTID = str
}
if let str = UserDefaults.standard.string(forKey: "LibraryNATIVEID") {
LibraryNATIVEID = str
}
if let str = UserDefaults.standard.string(forKey: "GlobalINSERTID") {
GlobalINSERTID = str
}
}
///广
func loadMoreAdMobs() {
guard openAdStatus else {return}
//广
loadSearchInterstitialAd { status in
if status {
print("成功加载搜索插页广告")
}else {
print("搜索插页广告加载失败")
}
}
loadPlayInterstitialAd{status in
if status {
print("成功加载播放插页广告")
}else {
print("播放插页广告加载失败")
}
}
}
func loadAnyAdMobs() {
guard openAdStatus else {return}
//
DispatchQueue.global(qos: .background).async {
[weak self] in
self?.loadGlobalInterstitialAd { status in
if status {
print("成功加载全局插页广告")
}else {
print("全局插页广告加载失败")
}
}
self?.loadSwitchInterstitialAd { status in
if status {
print("成功加载切歌插页广告")
}else {
print("切歌插页广告加载失败")
}
}
self?.loadLoadInterstitialAd { status in
if status {
print("成功加载下载插页广告")
}else {
print("下载插页广告加载失败")
}
}
self?.loadLibraryInterstitialAd { status in
if status {
print("成功加载曲库插页广告")
}else {
print("曲库插页广告加载失败")
}
}
}
}
deinit{
displaySearchTimer?.invalidate()
displaySearchTimer = nil
displayLibraryTimer?.invalidate()
displayLibraryTimer = nil
}
///广
func start() {
sharedInstance.start { status in
print("App启动开始加载广告")
}
}
//MARK: -
//广ID
private var OpenICEID:String!
//广ID
private var OpenHOSTID:String!
//广
enum OpenType:Int {
//
case ICE = 0
//
case HOST = 1
var title:String{
switch self {
case .ICE:
return "是冷启动开屏广告"
case .HOST:
return "是热启动开屏广告"
}
}
}
//广
private var appOpenAd:GADAppOpenAd?
//广
private var isLoadingOpenAd:Bool = false
//广
var isShowingOpenAd:Bool = false
//广
private var loadOpenAdTime:Date?
//广(5)
private var openAppDuration:TimeInterval = 10
//广
func setOpenAppDuration(_ duration:TimeInterval) {
self.openAppDuration = duration
}
//广
func getOpenAppDuration() -> TimeInterval {
return self.openAppDuration
}
//广
var completeOpenAdBlock:(() -> Void)?
///广
func loadOpenAd(_ type:OpenType,completion: @escaping (Bool) -> Void) {
guard openAdStatus else {return}
// 广广
if isLoadingOpenAd || isOpenAdAvailable() {
// 广广
completion(false)
return
}
isLoadingOpenAd = true
var UUID:String
switch type {
case .ICE:
UUID = OpenICEID
case .HOST:
UUID = OpenHOSTID
}
// 使 GADAppOpenAd load completion handler广
GADAppOpenAd.load(withAdUnitID: UUID, request: GADRequest()) { ad, error in
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
if let error = error {
print("加载开屏广告失败,失败原因: \(error.localizedDescription)")
self.isLoadingOpenAd = false
completion(false)
} else {
self.appOpenAd = ad
self.isLoadingOpenAd = false
//
self.appOpenAd?.fullScreenContentDelegate = self
//
self.loadOpenAdTime = Date()
completion(true)
}
}
}
}
///广
func showOpenAdIfAvailable(_ type:OpenType, completion:((GADAppOpenAd) -> Void)?) {
guard openAdStatus else {return}
// 广广广
guard !interstitialSwitch, !isShowingOpenAd else { return }
// 广广
if !isOpenAdAvailable() {
loadOpenAd(type) { [weak self] success in
guard let self = self else { return }
if success {
self.showOpenAdIfAvailable(type, completion: completion)
}
}
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)
}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!()
}
accessAppdelegate.setAudioSupport()
}
}
}
}else {
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 && wasAdexpirationTime(loadOpenAdTime)
}
//MARK: -
//广ID
private var SearchINSERTID:String!
//广ID
private var SearchNATIVEID:String!
///广
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 else {return}
guard let vc = searchViewController else {return}
let multipleAdOptions = GADMultipleAdsAdLoaderOptions()
//使
multipleAdOptions.numberOfAds = 1
searchAdLoader = GADAdLoader(adUnitID: SearchNATIVEID, rootViewController: vc, adTypes: [.native], options: [multipleAdOptions])
searchAdLoader?.delegate = self
searchAdLoader?.load(GADRequest())
}
///广
func layoutSearchNativeAd(in containerView: UIView) {
guard openAdStatus else {return}
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
MP_AnalyticsManager.shared.result_ads_chanceAction()
MP_AnalyticsManager.shared.result_ads_showAction()
// 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(completion: @escaping (Bool) -> Void) {
guard openAdStatus else {return}
// 广广
if isLoadingSearchInterstitialAd || isSearchInterstitialAdAvailable() {
// 广广
completion(false)
return
}
isLoadingSearchInterstitialAd = true
//广
GADInterstitialAd.load(withAdUnitID: SearchINSERTID, request: GADRequest()) { ad, error in
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
if let error = error {
print("加载搜索插页广告失败,失败原因: \(error.localizedDescription)")
self.isLoadingSearchInterstitialAd = false
//
loadGlobalInterstitialAd { status in
completion(status)
}
} else {
self.searchInterstitialAd = ad
self.isLoadingSearchInterstitialAd = false
//
self.searchInterstitialAd?.fullScreenContentDelegate = self
//
self.loadSearchInterstitialAdTime = Date()
completion(true)
}
}
}
}
///广
func showSearchInterstitialAdIfAvailable(completion:((GADInterstitialAd) -> Void)?) {
guard openAdStatus else {return}
// 广广广
guard !interstitialSwitch, !isShowingSearchInterstitialAd 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)
}
}
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 if let ad = globalInterstitialAd {
//广
//
if let block = completion {
block(ad)
}else {
isShowingGlobalInterstitialAd = 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:String!
///广
var playInterstitialAd:GADInterstitialAd?
///广
private var isLoadingPlayInterstitialAd:Bool = false
///广
var isShowingPlayInterstitialAd:Bool = false
///
private var loadPlayInterstitialAdTime:Date?
///广
var completePlayInterstitialAdBlock:(() -> Void)?
//广
func loadPlayInterstitialAd(completion: @escaping (Bool) -> Void) {
guard openAdStatus else {return}
// 广广
if isLoadingPlayInterstitialAd || isPlayInterstitialAdAvailable() {
// 广广
completion(false)
return
}
isLoadingPlayInterstitialAd = true
//广
GADInterstitialAd.load(withAdUnitID: PlayerINSERTID, request: GADRequest()) { ad, error in
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
if let error = error {
print("加载播放插页广告失败,失败原因: \(error.localizedDescription)")
self.isLoadingPlayInterstitialAd = false
loadGlobalInterstitialAd { status in
completion(status)
}
} else {
self.playInterstitialAd = ad
self.isLoadingPlayInterstitialAd = false
//
self.playInterstitialAd?.fullScreenContentDelegate = self
//
self.loadPlayInterstitialAdTime = Date()
completion(true)
}
}
}
}
///广
func showPlayInterstitialAdIfAvailable(completion:((GADInterstitialAd) -> Void)?) {
guard openAdStatus else {return}
// 广广广
guard !interstitialSwitch, !isShowingPlayInterstitialAd else { return }
//
if let date = interstitialDate {
if isShowInterstitialADAvailable(date) == false {
//
print("距上一次展示插页广告时长未超过要求,此次插页广告展示滞后")
return
}
}
// 广广
if !isPlayInterstitialAdAvailable() {
loadPlayInterstitialAd{ [weak self] success in
guard let self = self else { return }
if success {
self.showPlayInterstitialAdIfAvailable(completion: completion)
}
}
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 if let ad = globalInterstitialAd {
//广
//
if let block = completion {
block(ad)
}else {
isShowingGlobalInterstitialAd = true
interstitialSwitch = true
ad.present(fromRootViewController: nil)
}
}else {
MP_AnalyticsManager.shared.play_ads_showFailureAction("Ad loading failed")
}
}
//广
func isPlayInterstitialAdAvailable() -> Bool {
return playInterstitialAd != nil && wasAdexpirationTime(loadPlayInterstitialAdTime)
}
//MARK: -
//广ID
private var SwitchINSERTID:String!
///广
var switchInterstitialAd:GADInterstitialAd?
///广
private var isLoadingSwitchInterstitialAd:Bool = false
///广
var isShowingSwitchInterstitialAd:Bool = false
///
private var loadSwitchInterstitialAdTime:Date?
///广
var completeSwitchInterstitialAdBlock:(() -> Void)?
//广
func loadSwitchInterstitialAd(completion: @escaping (Bool) -> Void) {
guard openAdStatus else {return}
// 广广
if isLoadingSwitchInterstitialAd || isSwitchInterstitialAdAvailable() {
// 广广
completion(false)
return
}
isLoadingSwitchInterstitialAd = true
//广
GADInterstitialAd.load(withAdUnitID: SwitchINSERTID, request: GADRequest()) { ad, error in
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
if let error = error {
print("加载切歌插页广告失败,失败原因: \(error.localizedDescription)")
self.isLoadingSwitchInterstitialAd = false
loadGlobalInterstitialAd { status in
completion(status)
}
} else {
self.switchInterstitialAd = ad
self.isLoadingSwitchInterstitialAd = false
//
self.switchInterstitialAd?.fullScreenContentDelegate = self
//
self.loadSwitchInterstitialAdTime = Date()
completion(true)
}
}
}
}
///广
func showSwitchInterstitialAdIfAvailable(completion:((GADInterstitialAd) -> Void)?) {
guard openAdStatus else {return}
// 广广广
guard !interstitialSwitch, !isShowingSwitchInterstitialAd 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)
}
}
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 if let ad = globalInterstitialAd {
//广
//
if let block = completion {
block(ad)
}else {
isShowingGlobalInterstitialAd = 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:String!
///广
var loadInterstitialAd:GADInterstitialAd?
///广
private var isLoadingLoadInterstitialAd:Bool = false
///广
var isShowingLoadInterstitialAd:Bool = false
///
private var loadLoadInterstitialAdTime:Date?
///广
var completeLoadInterstitialAdBlock:(() -> Void)?
//广
func loadLoadInterstitialAd(completion: @escaping (Bool) -> Void) {
guard openAdStatus else {return}
// 广广
if isLoadingLoadInterstitialAd || isLoadInterstitialAdAvailable() {
// 广广
completion(false)
return
}
isLoadingLoadInterstitialAd = true
//广
GADInterstitialAd.load(withAdUnitID: LoadINSERTID, request: GADRequest()) { ad, error in
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
if let error = error {
print("加载下载插页广告失败,失败原因: \(error.localizedDescription)")
self.isLoadingLoadInterstitialAd = false
loadGlobalInterstitialAd { status in
completion(status)
}
} else {
self.loadInterstitialAd = ad
self.isLoadingLoadInterstitialAd = false
//
self.loadInterstitialAd?.fullScreenContentDelegate = self
//
self.loadLoadInterstitialAdTime = Date()
completion(true)
}
}
}
}
///广
func showLoadInterstitialAdIfAvailable(completion:((GADInterstitialAd) -> Void)?) {
guard openAdStatus else {return}
// 广广广
guard !interstitialSwitch, !isShowingLoadInterstitialAd 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)
}
}
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 if let ad = globalInterstitialAd {
//广
//
if let block = completion {
block(ad)
}else {
isShowingGlobalInterstitialAd = 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:String!
//ID
private var LibraryNATIVEID:String!
///广
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 else {return}
if libraryViewController == nil {
libraryViewController = vc
}
}
///广
func loadLibraryNativeAd() {
guard openAdStatus else {return}
guard let vc = libraryViewController, libraryNativeAds == nil else {return}
let multipleAdOptions = GADMultipleAdsAdLoaderOptions()
//使
multipleAdOptions.numberOfAds = 2
libraryAdLoader = GADAdLoader(adUnitID: LibraryNATIVEID, rootViewController: vc, adTypes: [.native], options: [multipleAdOptions])
libraryAdLoader?.delegate = self
libraryAdLoader?.load(GADRequest())
libraryNativeAds = []
}
///广
func layoutLibraryNativeAd(in containerView: UIView, index:Int) {
guard openAdStatus else {return}
containerView.subviews.forEach { item in
item.removeFromSuperview()
}
if index == 0 {
//
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
MP_AnalyticsManager.shared.lbr_ads_chanceAction()
MP_AnalyticsManager.shared.lbr_ads_showAction()
}else {
//
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
MP_AnalyticsManager.shared.list_ads_chanceAction()
MP_AnalyticsManager.shared.list_ads_showAction()
}
DispatchQueue.main.async {
[weak self] in
containerView.snp.updateConstraints { make in
make.height.equalTo(125)
}
}
// 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(completion: @escaping (Bool) -> Void) {
guard openAdStatus else {return}
// 广广
if isLoadingLibraryInterstitialAd || isLibraryInterstitialAdAvailable() {
// 广广
completion(false)
return
}
isLoadingLibraryInterstitialAd = true
//广
GADInterstitialAd.load(withAdUnitID: LibraryINSERTID, request: GADRequest()) { ad, error in
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
if let error = error {
print("加载曲库插页广告失败,失败原因: \(error.localizedDescription)")
self.isLoadingLibraryInterstitialAd = false
loadGlobalInterstitialAd { status in
completion(status)
}
} else {
self.libraryInterstitialAd = ad
self.isLoadingLibraryInterstitialAd = false
//
self.libraryInterstitialAd?.fullScreenContentDelegate = self
//
self.loadLibraryInterstitialAdTime = Date()
completion(true)
}
}
}
}
///广
func showLibraryInterstitialAdIfAvailable(completion:((GADInterstitialAd) -> Void)?) {
guard openAdStatus else {return}
// 广广广
guard !interstitialSwitch, !isShowingLibraryInterstitialAd 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)
}
}
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 if let ad = globalInterstitialAd {
//广
//
if let block = completion {
block(ad)
}else {
isShowingGlobalInterstitialAd = 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:String!
///广
private var globalInterstitialAd:GADInterstitialAd?
///广
private var isLoadingGlobalInterstitialAd:Bool = false
///广
var isShowingGlobalInterstitialAd:Bool = false
///
private var loadGlobalInterstitialAdTime:Date?
///广
var completeGlobalInterstitialAdBlock:(() -> Void)?
//广
func loadGlobalInterstitialAd(completion: @escaping (Bool) -> Void) {
guard openAdStatus else {return}
// 广广
if isLoadingGlobalInterstitialAd || isGlobalInterstitialAdAvailable() {
// 广广
completion(false)
return
}
isLoadingGlobalInterstitialAd = true
//广
GADInterstitialAd.load(withAdUnitID: GlobalINSERTID, request: GADRequest()) { ad, error in
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
if let error = error {
print("加载全局插页广告失败,失败原因: \(error.localizedDescription)")
self.isLoadingGlobalInterstitialAd = false
completion(false)
} else {
self.globalInterstitialAd = ad
self.isLoadingGlobalInterstitialAd = false
//
self.globalInterstitialAd?.fullScreenContentDelegate = self
//
self.loadGlobalInterstitialAdTime = Date()
completion(true)
}
}
}
}
///广
func showGlobalInterstitialAdIfAvailable(completion:((GADInterstitialAd) -> Void)?) {
guard openAdStatus else {return}
// 广广广
guard !interstitialSwitch, !isShowingGlobalInterstitialAd 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)
}
}
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: - 广 GADFullScreenContentDelegate
//广
func adWillPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) {
if ad === appOpenAd {//广
print("当前展示的广告是开屏广告广告ID--\(appOpenAd?.adUnitID ?? "")")
//
if appOpenAd?.adUnitID == OpenICEID {
MP_AnalyticsManager.shared.cold_ads_showSuccessAction()
}else if appOpenAd?.adUnitID == OpenHOSTID {
MP_AnalyticsManager.shared.hot_ads_showSuccessAction()
}
}else if ad === searchInterstitialAd {//广
print("当前展示的广告是搜索插页广告广告ID--\(searchInterstitialAd?.adUnitID ?? "")")
MP_AnalyticsManager.shared.search_ads_showSuccessAction()
}else if ad === playInterstitialAd {//广
print("当前展示的广告是播放插页广告广告ID--\(playInterstitialAd?.adUnitID ?? "")")
MP_AnalyticsManager.shared.play_ads_showSuccessAction()
}else if ad === switchInterstitialAd {//广
print("当前展示的广告是切歌插页广告广告ID--\(switchInterstitialAd?.adUnitID ?? "")")
MP_AnalyticsManager.shared.cut_ads_showSuccessAction()
}else if ad === loadInterstitialAd {//广
print("当前展示的广告是下载插页广告广告ID--\(loadInterstitialAd?.adUnitID ?? "")")
MP_AnalyticsManager.shared.dl_ads_showSuccessAction()
}else if ad === libraryInterstitialAd {//广
print("当前展示的广告是曲库插页广告广告ID--\(libraryInterstitialAd?.adUnitID ?? "")")
MP_AnalyticsManager.shared.listclk_ads_showSuccessAction()
}else if ad === globalInterstitialAd {//广
print("当前展示的广告是全局插页广告广告ID--\(globalInterstitialAd?.adUnitID ?? "")")
}
}
//广
func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
//广
interstitialDate = Date()
if ad === appOpenAd {//广
print("当前消失的广告是开屏广告广告ID--\(appOpenAd?.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!()
}
}
accessAppdelegate.setAudioSupport()
}
//广
func ad(_ ad: GADFullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) {
//广
interstitialDate = Date()
if ad === appOpenAd {//广
print("开屏广告展示时出错广告ID--\(appOpenAd?.adUnitID ?? ""),具体错误原因:\(error.localizedDescription)")
//
if appOpenAd?.adUnitID == OpenICEID {
MP_AnalyticsManager.shared.cold_ads_showFailureAction(error.localizedDescription)
}else if appOpenAd?.adUnitID == OpenHOSTID {
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!()
}
}
accessAppdelegate.setAudioSupport()
}
//MARK: - GADNativeAdLoaderDelegate
// 广
func nativeAdDidRecordImpression(_ nativeAd: GADNativeAd) {
}
// 广
func nativeAdDidRecordClick(_ nativeAd: GADNativeAd) {
}
// 广
func nativeAdWillPresentScreen(_ nativeAd: GADNativeAd) {
}
// 广
func nativeAdWillDismissScreen(_ nativeAd: GADNativeAd) {
}
// 广
func nativeAdDidDismissScreen(_ nativeAd: GADNativeAd) {
}
// 广
func nativeAdWillLeaveApplication(_ nativeAd: GADNativeAd) {
}
// 广
func adLoader(_ adLoader: GADAdLoader, didReceive nativeAd: GADNativeAd) {
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()
}
}
}
}