前段时间用了两周时间接广告,后来又改用其他方式接入了。
记一下接入过程,算是没白辛苦吧。 2021/2/22
--------------------------------- NRatel割 ---------------------------------
一、Admob+UnityAds+FacebookAudienceNetwork接入笔记
按照 https://developers.google.com/admob/unity/quick-start
1、创建Demo(Unity2019.4.24f1)。
2、下载插件(GoogleMobileAds-v5.4.0.unitypackage),并将插件导入Demo。
导入后弹出了Package Manager Resolver。点击Add Selected Registries。点击 Apply。
3、加入移动广告 SDK(安卓)。
Assets > External Dependency Manager > Android Resolver > Resolve。
要求切到 Android 平台。
切到后要求 Enable Android Auto-resolution。 Enable。
4、设置您的 AdMob 应用 ID。
Assets > Google Mobile Ads > Settings。(会生成一个配置文件于:Assets/Google Mobile Ads/Resources/GoogleMobileAdsSettings)
--------------------------------- NRatel割 ---------------------------------
安卓打包(不能播放)。
ClassNotFoundException com.google.android.gmd.ads.initialization.On...
Assets > External Dependency Manager > Android Resolver > ForceResolve
(ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH)。
下载最新JDK,并设置环境变量JAVA_HOME、CLASSPATH、PATH
https://www.oracle.com/java/technologies/javase-jdk15-downloads.html
注意:项目路径不能带特殊符号,否则会出错。因为要执行一些批处理命令。
--------------------------------- NRatel割 ---------------------------------
5、加入Admob中介测试套件
Admob中介:https://developers.google.cn/admob/unity/mediate
Admob中介测试套件:https://developers.google.cn/admob/unity/mediation-test-suite
6、集成 Facebook Audience Network SDK 及其适配器
https://developers.google.cn/admob/unity/mediation/facebook
技术直接拉到第三步。
下载 Google Mobile Ads mediation plugin for Facebook 解压并导入
(https://bintray.com/google/mobile-ads-adapters-unity/GoogleMobileAdsFacebookMediation#files)
会自动执行Resolve。
最好再执行一下ForceResolve。
不需要额外其他操作。
7、集成 Unity Ads SDK 及其适配器
https://developers.google.cn/admob/unity/mediation/unity
技术直接拉到第三步。
下载 Google Mobile Ads mediation plugin for Unity Ads 解压并导入
(https://bintray.com/google/mobile-ads-adapters-unity/GoogleMobileAdsUnityAdsMediation#files)
会自动执行Resolve。 最好再执行一下ForceResolve。
--------------------------------- NRatel割 ---------------------------------
安卓打包报错:uses-sdk:minSdkVersion 16 cannot be smaller than version 19 declared in library [:com.google.ads.mediation.unity-3.6.0.0:]
解决:Player Settings > Other Settings > Minimum API Level, 16改为19。
怎么找到GAID(Android)(需要安装了Google服务框架的手机)
https://support.spryfox.com/hc/en-us/articles/360005168034-How-do-I-find-my-GAID-Google-Advertising-ID-Google-Play-devices-only-
怎么找到IDFA?(IOS)
在AppStore中搜索"IDFA",随便安装一个工具软件,打开即有显示。
--------------------------------- NRatel割 ---------------------------------
二、Pangle接入笔记
1、接入Pangle SDK Unity 海外版。
下载地址:https://www.pangle.cn/union/media/union/download?platform=unity。(需要登录)
解压并导入其中的 PangleSDK.unitypackage 和 PangleAdapterScripts.unitypackage。
PangleSDK.unitypackage,内含Android (主要是 ioen_ad_sdk.aar)和 IOS 依赖的库。
--------------------------------- NRatel割 ---------------------------------
PangleAdapterScripts.unitypackage,内含其适配到admob 所需的文件。
其中,
Plugins/Android/proguard-user.txt:用于避免SDK代码被混淆
res/xml/file_paths.xml:为com.bytedance.sdk.openadsdk.TTFileProvider提供资源
res/xml/network_config.xml:设置网络安全配置。具体参考 https://developer.android.com/training/articles/security-config?hl=zh-cn
Plugins/Android/AndroidManifest.xml:只是标明了SDK需要的配置。实际使用时要将其删除,然后把其中重要的部分合并到游戏的AndroidManifest.xml中去。
Editor/ModifyUnityAndroidAppManifestSample.cs:告诉你在C#中怎么修改游戏的AndroidManifest.xml。
其他:适配用的C#代码。
2、Admob聚合Pangle。
(安卓部分的文档,https://developers.google.com/admob/android/rewarded-ads-custom-events)
Admob聚合各家广告(如Pangle)的过程其实就是:
1、初始化:AdMob初始化 => 适配器初始化 => Pangle初始化 => 回调AdMob初始化成功/失败。
(com.google.android.gms.ads.mediation.InitializationCompleteCallback 的 onInitializationSucceeded/onInitializationFailed)
2、广告加载:AdMob广告加载 => 适配器广告加载 => Pangle广告加载 => 回调AdMob广告加载成功/失败。
(com.google.android.gms.ads.mediation.InitializationCompleteCallback 的 onInitializationSucceeded/onInitializationFailed)
3、广告展示:AdMob广告展示 => 适配器广告展示 =>Pangle广告加载 => 回调AdMob广告开始/展示/完成/获得奖励。
(com.google.android.gms.ads.mediation.InitializationCompleteCallback 的 onVideoStart/onAdFailedToShow/onVideoComplete/onUserEarnedReward)
--------------------------------- NRatel割 ---------------------------------
适配器要做的就是:
实现Admob Adapter基类的接口方法,调用自家广告的接口,初始化、加载、展示成功/失败/完成某些过程时回调AdMob的回调方法。
注意:admob在调用适配器的广告加载接口时,会传过来一个MediationRewardedAdConfiguration,可以从它里面取到后台配置的可选参数,常用来从Admob后台传递placementID给适配器。
各家广告平台如果未和Admob合作,都需要自己实现这个适配器。
而Pangle 提供了一个示例。
下载地址:https://www.pangle.cn/union/media/union/download?platform=admob(需要登录)
注意:这个示例需要按照 Admob 激励广告自定义事件的文档,做一些修改,才可使用。
--------------------------------- NRatel割 ---------------------------------
安卓注意:
1、由于当前项目只需要激励视频,所以只保留AdmobRewardVideoAdapter.java,其他的 java文件全部删除。
2、写好适配代码后,将其放入Unity工程 Assets/PangleSDK/Android/Adapter/ 下。
3、实际测试时,发现适配器的初始化不会被调用。于是,要将pangle的初始化放在加载时,做个标记,保证只初始化一次。
--------------------------------- NRatel割 ---------------------------------
IOS:
1、由于当前项目只需要激励视频,所以只保留BUDAdmob_RewardCustomEventAdapter.h 和 BUDAdmob_RewardCustomEventAdapter.m,其他的 .h文件和.m文件全部删除(可改名)。
2、加载时调用pangle的初始化,并做个标记,保证只初始化一次。
3、 IOS只能调IOS的加载和播放。否则会因找不到适配器而报错。(安卓没问题,但尽量也只调自己的)。
4、 placementID 必须是String类型,在后台配置时要注意。(IOS中解析json,返回NSString时竟然没报错)。
--------------------------------- NRatel割 ---------------------------------
三、IOS打包遇到的问题
ios 打包的流程:
1)、将Unity工程 导出成 Xcode工程,Unity C# 中调用 BuildPipeline.BuildPlayer(BuildPlayerOptions buildPlayerOptions)
2)、使用 xcodebuild 将 Xcode工程打包成 ipa。
sdk使用cocoapods管理
--------------------------------- NRatel割 ---------------------------------
遇到的问题:
1、ruby 重装。(mac 10.15.7 和 ruby 2.6.3p62下 cocoapods 安装失败) :
关闭 mac sip(可能需要)
sudo rvm remove 3.0.0
rvm install 3.0.0
sudo gem install -n /usr/local/bin cocoapods
2、cocoapods 要安装在 /usr/local/bin下,否则unity不能识别。
四、激励视频初始化、加载和播放策略。
记得在上一家公司的时候,是用Fyber聚合,当时都没啥经验,每个广告位都申请一个广告位ID,整天为填充率低发愁。
原因是:广告请求加载后不展示,广告商会降低填充率。
其实还能想到几种策略。
策略一:所有广告场景共用一个adUnitId,游戏登录时初始化,初始化成功后立刻加载一个,然后每次播放关闭后重新加载。
优点:一定程度上解决了填充率低的问题。
缺点:1、解决的不彻底,登录时自动加载的广告还是有可能不被用户播放。2、不好处理加载失败的情况,因为官方不推荐失败即重试(可能连续失败),要想好重试策略(但似乎怎样都别扭)。
策略二:广告场景用可用一个或多个adUnitId,游戏登录时初始化,用户点击播放时主动加载并等待,加载完成后播放。
优点:能解决策略一的所有问题。
缺点:有等待时间,对体验有一定影响,要么强制让用户等待,要么用户可能中途放弃。
策略三:所有广告场景共用两个adUnitId(双线)。设置 cd,20s较合适。(Admob聚合政策:60s内请求超过3次可能会影响广告填充)。
优点:损失一些填充率提升体验(项目实际采用)。
缺点:维护逻辑较复杂。
--------------------------------- NRatel割 ---------------------------------
在我自己看来,策略二可能是最简单最清晰最理想的策略。目前也已经发现了有游戏采用。见《一念逍遥》的观影阁。
但是你不一定能说服你的老板采用策略二。因为他可能更在乎直观的感受而不管内在逻辑。哈哈。
其实仔细想一下,如果用户打算看激励广告,会在乎那一点等待时间吗?如果不打算看,你提前加载了也没用。
五、完整示例
已放入github,并抹掉了参数(请使用自己的参数)(用的策略一)。