前言
ApplovinMax是一個廣告聚合平臺,他會自帶自己的Applovin平臺廣告,在這個插件上面你可以下載其他的聚合渠道,與谷歌的Admob比較相似。都是廣告聚合平臺。
一.?ApplovinMax SDK插件的導入
1.下載插件集成 | SDK 集成指南 | MAX | Support Center | AppLovin
這里盡可能選擇插件的形式下載,不要讓UnityPackageManager來進行插件的管理,因為如果有多個Sdk的話ExternalDependencyManager的使用版本不一致,UnityPackageManager會報錯。
2.設置插件
在這里下載安裝你所需要的渠道插件
這里完成你的個性化設置,在SdkSettings里面填入你的Key,如果你需要顯示隱私協議,你可以把PrivacySettings里面的Enable勾選,并且填入你的個人與團隊隱私設置。
二. ApplovinMax 的打包設置(如果你的ios打包沒有出現錯誤請跳過這一步)
這里踩了個大坑,ios的包打不出來,報錯。而且解決報錯之后ios的包會閃退。
1.首先,我這里打包使用的是CocoaPods,也就是說打包環境的話,我需要去配置Podfile,在那個里面設置靜態鏈接庫與動態鏈接庫。
2.由谷歌提供的ExternalDepenenvyManager他的ios包管理只會將全部的庫設置為靜態庫或者動態庫,這種沒有個性化的設置,是不能滿足于多插件的,我沒有找到,如果有的化希望評論區大佬能指點一下,謝謝。
3.為什么會有靜態庫與動態庫之分?
CocoaPods 會將依賴項作為靜態庫(*.a)集成到項目中。當你使用 use_frameworks! 時,CocoaPods 會將依賴項編譯成動態框架(*.framework),并以動態鏈接的方式集成到你的項目中。
這個指令對于使用 Swift 語言或依賴于 Swift 的庫時是必要的,因為 Swift 要求依賴必須是動態框架。
在一些特定的情況下,某些 CocoaPods 的庫可能僅支持靜態庫,因此如果你在項目中使用了這些庫,可能不需要 use_frameworks!。
為何需要 use_frameworks!?
Swift 和 Objective-C 混合項目:如果你的項目包含 Swift 代碼或庫,那么使用 use_frameworks! 是必要的,因為 Swift 代碼只能與其他 Swift 代碼通過動態框架互操作。
避免靜態庫鏈接沖突:在一些情況下,使用靜態庫可能會導致符號沖突或其他鏈接問題,使用動態框架可以避免這些問題。
4.這樣就大致理解了CocoaPods的打包原理,根據Podfile來配置ios的打包環境,進行打包。
5.這樣的話,如果插件多,那么在ExternalDepenenvyManager必定會出現打包的沖突,在我接收的這個項目中最初的配置是這樣的
如果我添加了谷歌AdMob的聚合,那么打包就會出現關于谷歌AdMob聚合找不到庫的錯誤。解決的方法就是勾選Link frameworks statically, 但是我其他的插件不允許這樣操作。那么就需要從Podfile入手
7.最簡單的方法就是在Xcod那邊的Podfile修改
這樣就可以了。
8.如果你還安裝了FaceBook的插件,恭喜你,這個坑和這個是一樣的。他能打出包,但是在游戲運行的時候會閃退。報錯為
這個玩意其實FaceBook那邊的bug,但是一直沒有修復。大致意思就是他的初始化必須是在動態庫才可以。
9.這時候你查Max官網的解決方案就是
這個其實就把他設置為了動態庫,而不是靜態庫,那么還會出現之前插件設置的沖突問題,所以他倆的解決方案是一樣的。
10.我的Podfile最后的設置就為(這里你為了不必每次打包都修改Podfile,最好是寫一個自動化腳本,這里我就不贅述怎么去寫了)
三. ApplovinMax 的代碼
1.初始化代碼
// 激勵廣告位
#if UNITY_IPHONEprivate string _rewardAdUnitId = ""; // iosprivate string _interstitialAdUnitId = ""; // ios
#elseprivate string _rewardAdUnitId = ""; //androidprivate string _interstitialAdUnitId = "";//android
#endifprivate string[] _adUnitId;private string _sdkKey = "";
public void InitSDK()
{_adUnitId = new[] { _rewardAdUnitId, _interstitialAdUnitId };MaxSdkCallbacks.OnSdkInitializedEvent += (MaxSdkBase.SdkConfiguration sdkConfiguration) =>{// SDK 初始化成功后的邏輯isInit = true;RegisterEventHandlers();MaxSdk.SetVerboseLogging(true);};MaxSdk.SetSdkKey(_sdkKey);MaxSdk.InitializeSdk(_adUnitId);
}?
public void PreLoadAd()
{MaxSdk.LoadInterstitial(_interstitialAdUnitId);MaxSdk.LoadRewardedAd(_rewardAdUnitId);
}
public void DisplayAd(string adSpaceId)
{if (MaxSdk.IsRewardedAdReady(_rewardAdUnitId)){MaxSdk.ShowRewardedAd(_rewardAdUnitId);}else{PreLoadAd();}
}
這里只需要先初始化,后加載,在進行播放即可。
2.綁定事件
private void RegisterEventHandlers(){// 注冊插屏廣告回調MaxSdkCallbacks.Interstitial.OnAdLoadedEvent += OnInterstitialAdLoadedEvent;MaxSdkCallbacks.Interstitial.OnAdLoadFailedEvent += OnInterstitialAdLoadFailedEvent;MaxSdkCallbacks.Interstitial.OnAdRevenuePaidEvent += OnInterstitialAdRevenuePaidEvent;MaxSdkCallbacks.Interstitial.OnAdClickedEvent += OnInterstitialAdClickedEvent;MaxSdkCallbacks.Interstitial.OnAdDisplayedEvent += OnInterstitialAdDisplayedEvent;MaxSdkCallbacks.Interstitial.OnAdHiddenEvent += OnInterstitialAdHiddenEvent;MaxSdkCallbacks.Interstitial.OnAdDisplayFailedEvent += OnInterstitialAdFailedToDisplayEvent;}private void OnInterstitialAdLoadedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo){XDebug.LogInfo($"Interstitial ad loaded. Network: {adInfo.NetworkName}, Revenue: {adInfo.Revenue}");}// 處理插屏廣告加載失敗private void OnInterstitialAdLoadFailedEvent(string adUnitId, MaxSdkBase.ErrorInfo errorInfo){Debug.LogWarning($"Interstitial ad failed to load. AdUnitId: {adUnitId}, Error Code: {errorInfo.Code}, Message: {errorInfo.Message}");}// 處理插屏廣告收入回調private void OnInterstitialAdRevenuePaidEvent(string adUnitId, MaxSdkBase.AdInfo adInfo){Debug.Log($"MAX Interstitial Ad Revenue Paid:");}// 處理插屏廣告點擊private void OnInterstitialAdClickedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo){Debug.Log("Interstitial ad was clicked.");}// 處理插屏廣告展示private void OnInterstitialAdDisplayedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo){Debug.Log("Interstitial ad full screen content opened.");}// 處理插屏廣告關閉private void OnInterstitialAdHiddenEvent(string adUnitId, MaxSdkBase.AdInfo adInfo){Debug.Log("Interstitial ad full screen content closed.");}// 處理插屏廣告展示失敗private void OnInterstitialAdFailedToDisplayEvent(string adUnitId, MaxSdkBase.ErrorInfo errorInfo, MaxSdkBase.AdInfo adInfo){Debug.LogWarning($"MAX Interstitial Ad Failed to Display: {errorInfo.Message}");}
這里的綁定事件,在初始化后的回調綁定即可。
3.這里我踩了一個坑,就是OnAdReceivedRewardEvent回調不會發生,首先這些回調必須要保證發生在主線程,我上面的寫法是有點問題的。如果過你發現你的任何一個回調沒有運行的話,你可以檢查一下是否在主線程調用該函數。
我這里的解決辦法就是利用協程,用函數包裝了一下,之后都保證代碼的運行在主線程就可以了。
這里的代碼必須在yeild之后,在yeild之后才可以保證后續代碼在主線程上面
4.哎,博主博主,我的某些聚合的廣告加載不出來,但是其他渠道的廣告可以加載出來是什么情況啊?兄弟,你真是問對人了,首先你先用Max的Mediation Debugger測試一下,他們的測試廣告是否可以加載出來,這個加載不出來也不要緊,比如說我的unity Ad是加載不出來的,但是在加載真事廣告是可以出來的,說明他沒有測試頁。測試完之后再測試真事廣告就可以了。如果測試廣告正常,而你的真實廣告沒出來,那么極有可能就是你的地區問題,再看報錯是否204或者5001如果是,那么就是地區問題,就不要追究了。