ApplovinMax接入Unity(包括我自己踩的一些坑)

前言

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如果是,那么就是地区问题,就不要追究了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912078.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912078.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux系统执行过程中的5种特殊情况

正在执行的用户态X切换用户态进程Y的过程为系统中常用的情况,但并非不能完全准确地反应系统的全部执行场景,还有一些场景比较特殊,主要包括以下5种情况 一.内核线程之间通过中断处理过程中的调度时机发生进程切换,与一般的情况非常…

9. 元素拖拽

元素拖拽 API 介绍 1. 拖放过程 整个拖放过程中,存在两个关键元素:拖拽元素、放置元素 拖拽元素:被拖拽的元素 drag:元素被拖拽时触发,从开始拖拽到拖拽结束前整个过程会一直持续的触发dragstart:元素被…

用来提升同花顺软件进程优先级的C#程序

为了提高炒股软件同花顺的运行速度,消除卡顿,编写一个C#程序,来设置同花顺进程的优先级。 using System; using System.Diagnostics; using System.Security.Principal;namespace ProcessPrioritySetter {class Program{static void Main(st…

linux初阶---一些指令

一.快速认识6-8个简单指令 1.pwd pwd指令是用来查看用户当前所处在的目录(目录的概念在理解上可以等效为文件夹)。 (1)在windows系统中我们通过文件路径表示唯一的文件,在linux中也是一样的,所以pwd是一个很…

全国产传感器外壳的综合分析:材料选择、考量因素与尺寸精度影响

全国产传感器作为现代工业、科研、生活等领域的 “感知触角”,其外壳的性能与质量直接关乎设备的稳定性、可靠性与使用寿命。从材料选型、关键考量因素到尺寸精度的影响,每个环节都需精细把控。 一、全国产传感器外壳材料的多元选择 全国产传感器外壳材…

本地缓存Caffeine详解(含与Spring Cache集成)

目录 一、介绍 二、Caffeine核心原理与架构设计 2.1 存储引擎与数据结构 2.2 缓存淘汰策略 2.3 并发控制机制 三、入门案例 3.1 引入依赖 3.2 测试接口 3.3 小结 四、Caffeine常用方法详解 4.1 getIfPresent 4.2 get 4.3 put 4.4 putAll 4.5 invalidate 4.6 inv…

论特定领域软件架构

20250413-作 题目 特定领域软件架构DSSA(Domain Specific Software Architecture)就是在一个特定应用领域中为一组应用提供组织结构参考的标准软件体系结构。对DSSA 研究的角度、关心的问题不同导致了对DSSA 的不同定义。DSSA 的必备特征如下。 一…

iOS 远程调试与离线排查实战:构建非现场问题复现机制

iOS开发者都知道,调试最怕两个字:“偶发”。用户说App闪退了,你点了十遍也没问题;测试说功能卡顿了,你抓日志时它又顺滑如新。最麻烦的是,这种“现场问题”往往在你连接不到用户设备时发生。 面对这种情况…

SpringBoot -- 整合 Swagger3

8.SpringBoot3 整合 Swagger3 由于目前主流的开发模式是前后端分离开发。所以前后端的交互需要通过一个 API&#xff08;开发接口&#xff09; 来规范。而这个接口的开发是由后端程序员编写的。“网站式 API 文档” 1.导入依赖 <!-- 引入swagger3(springdoc)的依赖--> …

A Machine Learning Approach for Non-blind Image Deconvolution论文阅读

A Machine Learning Approach for Non-blind Image Deconvolution 1. 研究目标与实际意义2. 创新方法与模型设计2.1 核心思路2.2 正则化反演:理论与公式2.2.1 退化模型2.2.2 正则化目标函数2.2.3 傅里叶域闭式解2.3 MLP去伪影:架构与训练2.3.1 MLP架构设计2.3.2 训练流程2.3.…

微信小程序<rich-text>支持里面图片点击放大

使用<rich-text>渲染类似下面的html代码&#xff1a; <div stylecolor: red>宠物友好<br/>xxx提供宠物友好服务&#xff0c;具体请见下图<br/></div> <img srchttps://xxx.com/xxx1.png width100%/> <img srchttps://xxx.com/xxx2.png…

BVH 文件是一种用于记录 3D 动画数据的文件格式,常用于 3D 建模和动画制作。以下是对这个 BVH 文件的逐行解读

BVH 文件是一种用于记录 3D 动画数据的文件格式&#xff0c;常用于 3D 建模和动画制作。以下是对这个 BVH 文件的逐行解读&#xff1a; HIERARCHY ROOT Hips { OFFSET 0 0 0 CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation JOINT LeftUpLeg { OFFSE…

C语言开发:Onvif(一)

根据ONVIF官网 的介绍&#xff1a; ONVIF是一个开放的安防行业组织&#xff0c;致力于为安防行业提供和促进标准化开放接口&#xff0c;以实现IP网络安防产品和服务的有效互操作性。 在具体实现上&#xff0c;ONVIF使用了Web Service的方式&#xff0c;设备通过WSDL定义的接口…

中科米堆三维扫描仪耳机3D扫描尺寸测量数字化建模

当下&#xff0c;耳机已从单纯的音频输出设备进化为集娱乐、健康、办公于一体的智能穿戴终端。相关数据显示&#xff0c;2025年全球智能个人音频设备出货量突破4.55亿台&#xff0c;中国以22%的增速领跑全球&#xff0c;其中开放式耳机&#xff08;OWS&#xff09;出货量占比达…

学习接口自动化框架pytest有哪些好处?

学习 pytest 作为接口自动化测试框架&#xff0c;具有以下显著优势&#xff0c;能大幅提升测试效率和质量&#xff1a; Pytest自动化测试教程&#xff0c;自动化必备之Pytest测试框架训练营&#xff0c;只需一小时速成&#xff0c;学会直接上手实操&#xff01; 1. 代码简洁&…

LinuxBridge的作用与发展历程:从基础桥接到云原生网络基石

LinuxBridge作为Linux网络虚拟化的核心组件&#xff0c;已悄然支撑互联网基础设施20余年。它不仅是虚拟机网络连接的桥梁&#xff0c;更是容器网络、云原生架构的隐形支柱。 一、LinuxBridge的核心作用剖析 1. 二层网络虚拟化的实现者 本质功能&#xff1a;模拟物理交换机行为…

探讨 SYSCFG 时钟对 ADC 采样的影响

探讨 SYSCFG 时钟对 ADC 采样的影响 在嵌入式系统开发中&#xff0c;对于 GD32F4 系列微控制器&#xff0c;理解 SYSCFG 时钟与 ADC 采样之间的关系至关重要。 以下是详细分析&#xff1a; 一、SYSCFG 时钟对 ADC 采样过程的基础性作用 1. 提供采样时钟信号 ADC 采样需要时钟…

Spring Boot 项目实训 - 图书信息网站

文章目录 1. 实训目的2. 系统设计3. 运行演示4. 实现步骤4.1 创建数据库与表4.2 创建Spring Boot项目4.3 创建实体类4.4 创建映射器接口4.5 编写应用配置文件4.6 测试映射器接口4.7 创建服务类4.8 创建控制器4.9 准备静态资源4.10 创建模板页面4.11 测试整个项目 5. 实训总结 1…

GPU 性能可变性分析框架

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象。 分析来自 GPU 分析器的大规模性能日志通常需要数 TB 的内存和数小时的运行时间&#xff0c;即使是基本摘要也是如此。这些限制会阻止及时洞察&#xff0c;并阻碍将性能分析集成到自动化工作流程中…

Redis主从复制原理

一、Redis主从复制概述 Redis主从复制&#xff08;Master-Slave Replication&#xff09;是Redis实现高可用性和读写分离的基础架构。通过主从复制&#xff0c;数据可以从一个Redis服务器&#xff08;主节点&#xff09;复制到一个或多个Redis服务器&#xff08;从节点&#x…