
ApplovinMax接入Unity(包括我自己踩的一些坑)
ApplovinMax是一个广告聚合平台,他会自带自己的Applovin平台广告,在这个插件上面你可以下载其他的聚合渠道,与谷歌的Admob比较相似。都是广告聚合平台。
前言
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_IPHONE
private string _rewardAdUnitId = ""; // ios
private string _interstitialAdUnitId = ""; // ios
#else
private string _rewardAdUnitId = ""; //android
private string _interstitialAdUnitId = "";//android
#endif
private 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如果是,那么就是地区问题,就不要追究了。
更多推荐
所有评论(0)