这里只总结前端接入流程和注意事项,后台配置请参考官方详细文档

mopub广告有以下类型

  • Bananer(横幅)
  • Interstitial(插屏)
  • Rewarded Video(激励视频)
  • Rewarded Playable(互动式激励 MRAID)
  • Native(原生)

1:下载mopub-unity-sdk

这里下载最新的unity package

2:设置支持的广告平台

推荐使用插件提供的MoPub SDK Manager来管理

需要注意的是,每次升级或者安装或者删除(删除一般只需要在Assets/MoPub/Mediation目录下删除对应目录即可)某个广告平台后,建议用External Dependency Manager工具重新设置一下jar和aar依赖。

另外在网络不好的情况下,使用External Dependency Manager会存在所需依赖拉不下来的情况,那么就需要手动把需要的依赖放到Plugins/Android目录下

这部分集成可以参考官方文档:Integrate the MoPub SDK for Unity

3:SDK接入

3.1初始化

首先根据集成的广告类型,从后台获得对应的广告id

插件中提供了Prefab来进行初始化,同时我们也可以选择使用底层代码进行初始化。笔者使用了后者。

3.1.1 预定义一些参数

//ios端旗帜式广告    public string iOSBannerID;    //ios插页式广告    public string iOSInterstitialID;    //ios激励视频广告    public string iOSVideoID;    //安卓旗帜式广告    public string AndroidBannerID;    //安卓插页式广告    public string AndroidInterstitialID;    //安卓激励视频广告    public string AndroidVideoID;    //请求广告的函数的参数是string数组,用来装上面的广告ID    private string[] _bannerAdUnits;    private string[] _interstitialAdUnits;    private string[] _rewardedVideoAdUnits;    MPRewardedVideoListener mpRewardedVideoListener = null;    DateTime lastAdTime = new DateTime(2020, 1, 1);

3.1.2 初始化

#if UNITY_IOS        _bannerAdUnits = new string[] { iOSBannerID };        _interstitialAdUnits = new string[] { iOSInterstitialID };        _rewardedVideoAdUnits = new string[] { iOSVideoID }; #elif UNITY_ANDROID          _bannerAdUnits = new string[] { AndroidBannerID };        _interstitialAdUnits = new string[] { AndroidInterstitialID };        _rewardedVideoAdUnits = new string[] { AndroidVideoID };#endif        var anyAdUnitId = _rewardedVideoAdUnits[0];        MoPub.InitializeSdk(new MoPub.SdkConfiguration        {            //设置一个任意有效的广告Id            AdUnitId = anyAdUnitId,            LogLevel = MoPub.LogLevel.Debug,            MediatedNetworks = new MoPub.MediatedNetwork[] {                },        });

3.1.3 设置广告插件

根据项目中需要集成的广告类型,设置对应的广告插件

//加载激励视频的插件MoPub.LoadRewardedVideoPluginsForAdUnits(_rewardedVideoAdUnits);//初始化各种广告,现在还没有使用好几个id的需求,所以每个广告类型先都用一个id,所以都取[0]。//按着官方用例,如果有多种id的话可以写一个for循环直接遍历创造就好

其它类型api

 MoPub.LoadBannerPluginsForAdUnits(_bannerAdUnits); MoPub.LoadInterstitialPluginsForAdUnits(_interstitialAdUnits); MoPub.LoadRewardedVideoPluginsForAdUnits(_rewardedVideoAdUnits); MoPub.LoadRewardedVideoPluginsForAdUnits(_rewardedRichMediaAdUnits);

3.1.4 根据广告类型具体集成

官网提供了Banner,Interstitial,Rewarded Video三种类型广告的集成教程,笔者这边只集成了激励视频,故后文以激励视频为例继续展开(需要注意的是激励视频教程中提到的后台要设置Callback Server)。

step1:在SDK初始化成功的回调中,先预加载激励视频。
step2:播放激励视频前先调用MoPub.HasRewardedVideo(adUnitId);检测视频是否准备好
step3:调用MoPub.ShowRewardedVideo(adUnitId);播放视频
step4:处理各种回调

mpRewardedVideoListener = new MPRewardedVideoListener();        // 绑定初始化回调        MoPubManager.OnSdkInitializedEvent += OnSdkInitializedEvent;        //激励视频广告回调        //激励视频预加载成功        MoPubManager.OnRewardedVideoLoadedEvent += mpRewardedVideoListener.OnRewardedVideoLoadedEvent;        //激励视频预加载失败        MoPubManager.OnRewardedVideoFailedEvent += mpRewardedVideoListener.OnRewardedVideoFailedEvent;        //激励视频加载Expired        MoPubManager.OnRewardedVideoExpiredEvent += mpRewardedVideoListener.OnRewardedVideoExpiredEvent;        //激励视频广告播放完(在播放完,用户点了关闭按钮后触发)        MoPubManager.OnRewardedVideoShownEvent += mpRewardedVideoListener.OnRewardedVideoAdShowed;        //激励视频播放失败        MoPubManager.OnRewardedVideoFailedToPlayEvent += mpRewardedVideoListener.OnRewardedVideoAdShowFailed; ;        //激励视频播放关闭        MoPubManager.OnRewardedVideoClosedEvent += mpRewardedVideoListener.OnRewardedVideoAdClosed;    private void OnSdkInitializedEvent(string adUnitId)    {        Debug.LogError("mopub SDK初始化成功, adUnitId:" + adUnitId);#if UNITY_IOS          MoPub.RequestInterstitialAd (iOSInterstitialID);        MoPub.RequestRewardedVideo (iOSVideoID);#elif UNITY_ANDROID         //MoPub.RequestInterstitialAd(AndroidInterstitialID);        Debug.LogError("Pre-fetch the rewarded video ad");        MoPub.RequestRewardedVideo(AndroidVideoID);//请求预加载#endif    }class MPRewardedVideoListener{    public Action onReward = null;    public Action onRewardClose = null;    public Action onRewardError = null;    bool rewardSuccess = false;    public void OnRewardedVideoLoadedEvent(string adUnitId)    {        Debug.LogError("激励视频预加载成功 :" + adUnitId);    }    public void OnRewardedVideoFailedEvent(string adUnitId, string errorMsg)    {        Debug.LogError("激励视频预加载失败:" + adUnitId + ", msg:" + errorMsg);    }    public void OnRewardedVideoExpiredEvent(string adUnitId)    {        Debug.LogError("激励视频加载Expired:" + adUnitId);        AnalyticsManager.LogEvent(AnalyticsEventID.RewardVideo_ShowFail);        rewardSuccess = false;        var act = onRewardError;        onRewardError = null;        if (act != null)        {            act();        }    }    public void OnRewardedVideoAdShowed(string adUnitId)    {        Debug.LogError("激励视频广告播放完");        AnalyticsManager.LogEvent(AnalyticsEventID.RewardVideo_ShowSuccess);        rewardSuccess = true;    }    public void OnRewardedVideoAdShowFailed(string adUnitId, string errorMsg)    {        Debug.LogError("激励视频播放失败 :" + adUnitId + ", msg:" + errorMsg);        AnalyticsManager.LogEvent(AnalyticsEventID.RewardVideo_ShowFail);        rewardSuccess = false;        var act = onRewardError;        onRewardError = null;        if (act != null)        {            act();        }    }    public void OnRewardedVideoAdClicked(string scene)    {        AnalyticsManager.LogEvent(AnalyticsEventID.RewardVideo_Click);    }    public void OnRewardedVideoAdClosed(string adUnitId)    {        Debug.LogError("激励视频播放关闭 :" + adUnitId);        if (rewardSuccess)        {            var act = onReward;            var act1 = onRewardClose;            onRewardClose = null;            onRewardError = null;            onReward = null;            if (act != null)            {                act();            }            if (act1 != null)            {                act1();            }        }        else        {            var act = onRewardError;            var act1 = onRewardClose;            onRewardClose = null;            onRewardError = null;            onReward = null;            if (act != null)            {                act();            }            if (act1 != null)            {                act1();            }        }        rewardSuccess = false;    }}

4:测试

官方Test文档中有提供100%填充的广告id,可以先用这些id来测试流程。没问题后再切换到正式id。同时也可以根据这个来很快定位是后台配置还是前端的问题。
另外最好挂V.P.N来测试广告~

5:注意事项

5.1 广告填充率低下的问题

笔者使用聚合平台集成了MoPub、Applovin、IronSource、UnityAds。通过后台控制只开启某个广告平台,发现MoPub和Applovin的填充率很低,Applovin是展示几个后就再也拉不到了,MoPub是自始至终一次都没有填充。另两个没有问题。目前还没有找到原因

5.2 各广告平台额外的配置项

上文中写到了这段代码:

            MediatedNetworks = new MoPub.MediatedNetwork[] {                },

这里即按照广告平台来具体设置一些信息,但是各个广告平台需要设置哪些信息呢。可以参考AppLovin,IronSource(在这些页面左侧可以很方便导航到其它广告平台)。根据文档可以看到还需要配置一些信息,最终代码如下:

            MediatedNetworks = new MoPub.MediatedNetwork[] {                             //AppLovin                new MoPub.SupportedNetwork.AppLovin{                    NetworkConfiguration=new Dictionary<string, string>(){                        { "sdk_key","xxxxxxxxx"},                    },                },                //IronSource                new MoPub.SupportedNetwork.IronSource                {                    NetworkConfiguration=new Dictionary<string, string>()                    {                        { "appKey","xxxxxxxxx"},                    }                }                },

至于在unity中上述sdk_key和appKey这些字符串是哪里来的,可以通过各个广告平台在Unity这边的XXXXNetworkConfig.cs脚本中获得。比如AppLovinNetworkConfig.cs的内容为:

可以很快定位关键字为:sdk_key
事实上Applovin的这个配置就是AndroidManifest中的(有些聚合SDK是把参数配置到AndroidManifest.xml中):

<meta-data android:name="applovin.sdk.key" android:value="xxxxxx" />

5.3 激励视频预加载

不知道从哪里看过一眼,说MoPub的激励视频是自己处理了预加载的。但是笔者项目中发现第一次预加载成功,顺利播放视频后。后续调用MoPub.HasRewardedVideo(adUnitId)总是返回false

无奈只有自己处理,主要做了以下工作:

  • 定义bool flag来指定当前是否正在预加载视频,来规避重复的预加载。即只能在flag==false的情况下调用MoPub.RequestRewardedVideo(adUnitId);进行视频预加载,且在调用的同时,设置flag=true
  • 用户在成功播放视频的onclose回调中,再次预加载视频
  • 预加载成功或者失败的回调中,设置flag为false

6:官方unity sdk demo

mopub unity sdk

7:参考文档

unity导入Mopub Sdk 并导出安卓和iOS包

更多相关文章

  1. Android(安卓)基于Socket.io即时通讯IM实现,WebRTC实现视频通话
  2. Vitamio视频播放器
  3. 【Android(安卓)应用开发】Android中使用ViewPager制作广告栏效
  4. 20、android解决方案
  5. Android(安卓)使用ExoPlayer视频播放 (一)
  6. Qt 实现android camera摄像头的preview和拍照
  7. android AV同步详解
  8. android赚钱 植入有米广告方法
  9. android获取视频每一帧

随机推荐

  1. android so文件是什么
  2. Android(安卓)Bluetooth 相关说明
  3. 我的android 第16天 - SQLite数据库
  4. Android中使用WebView, WebChromeClient
  5. Android(安卓)Telephony 框架分析
  6. android MultiDex multiDex原理(一)
  7. Android创建SDCard镜像
  8. Android编译环境搭建步骤(公司) - 写给自
  9. android之Binder机制解析
  10. Android中ListView和ScrollView总结【安