How to integrate Azerion Ads Unity package
Configure AdMob App ID
Android
- Add
Custom Main Manifest
for android via Project Settings->Player->Publish Settings
- Add AppLovin App ID in
Assets/Plugins/Android/AndroidManifest.xml
<application>
<activity android:name=".MainActivity"/>
...
<meta-data android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="YOUR_AdMob_APP_ID"/>
...
</application>
iOS
- Create a
NAME_Dependencies.xml
file with required AzerionAdsAbmobAdapter
adapter dependency in editor folder.
<dependencies>
<iosPods>
<iosPod name="AzerionAdsAbmobAdapter" version="~> 1.0.1" bitcodeEnabled="true" addToAllTargets="false" />
</iosPods>
</dependencies>
- After exporting the xcode project add
GADApplicationIdentifier
in your info.plist file.
<key>GADApplicationIdentifier</key>
<string>YOUR-ADMOB-APPID-HERE</string>
Configure AppLovin App ID
Android
- Add
Custom Main Manifest
for android via Project Settings->Player->Publish Settings
- Add AppLovin App ID in
Assets/Plugins/Android/AndroidManifest.xml
<application>
<activity android:name=".MainActivity"/>
...
<meta-data android:name="applovin.sdk.key"
android:value="YOUR_APPLOVIN_APP_ID"/>
...
</application>
NOTE
During pre-build and post-build we check AdMob App Id configuration. So if you didn't configure it then during building
project plugin will throw exception in console and display the configuration dialog.
iOS
- Create a
NAME_Dependencies.xml
file with required AzerionAdsAppLovinAdapter
adapter dependency in editor folder.
<dependencies>
<iosPods>
<iosPod name="AzerionAdsAppLovinAdapter" version="~> 1.0.0" bitcodeEnabled="true" addToAllTargets="false" />
</iosPods>
</dependencies>
- After exporting the xcode project add
AppLovinSdkKey
in your info.plist file.
<key>AppLovinSdkKey</key>
<string>YOUR-APPLOVIN-APPID-HERE</string>
Configure iOS Project
After exporting the iOS Xcode project you need to add SKAdNetworkItems
key with SKAdNetworkIdentifier
values. For
google AdMob it is cstr6suwn9.skadnetwork
and you must have to add additional buyers identifier.
<key>SKAdNetworkItems</key>
<array>
<dict>
<key>SKAdNetworkIdentifier</key>
<string>cstr6suwn9.skadnetwork</string>
</dict>
<array>
Dependency management
For dependency resolution we are using External Dependency Manager for Unity(EDM4U)
.
For Android dependency management
- Open the file
baseProjectTemplate.gradle
file in Assets/Plugins/Android
. If you don't have such a file, go
to Project Settings->Player->Publishing Settings
and enable the baseProjectTemplate gradle option. - Add or merge the following section.
allprojects {
...
repositories {
google()
jcenter()
flatDir {
dirs "${project(':unityLibrary').projectDir}/libs"
}
mavenCentral()
maven {
url "https://jitpack.io"
}
}
}
- Add
mainTemplate.gradle
. Go to Project Settings->Player->Publishing Settings
and enable the mainTemplate gradle option.
Add the following dependencies
dependencies {
...
implementation 'com.azerion:azerion-sdk-ads-core:2.1.0'
implementation 'com.azerion:azerion-sdk-ads-unity-android-adapter:1.0.0'
// If we want to mediate ad from AdMob
implementation 'com.azerion:azerion-sdk-ads-mediation-admob:2.1.0'
//If we want to mediate ad from AppLovin
implementation 'com.azerion:azerion-sdk-ads-mediation-applovin:1.0.0'
...
**DEPS**}
iOS Dependency Management
Install cocoapods in your Mac using following command:
$ sudo gem install cocoapods
Enable cocoapods integration from
Assets --> External Dependency Management --> iOS Resolver --> Settings
Create a NAME_Dependencies.xml
file with required adapter dependencies if needed.
Create the SDK default ad config
Android
At runtime SDK downloads the ad configuration for the app based on thePackage Name
. You can create a offline default
ad configuration file for the app via AzerionAds -> Configuration -> Android -> Create configuration
options. What it
does that behind the scene it download the current snapshot of the SDK config for this app from backend and create
the default_azerion_sdk_config.json
file in /Assets/Azerion/Ads/Editor/Configuration/Android
directory. Whenever SDK
failed to fetch the ad configuration from backend it will use the offline default ad config for ad serving.
Initialize Azerion Ads SDK
public class AzerionAdsController : MonoBehaviour
{
void Start()
{
var settings = new Settings(withUserConsent:false, gdprConsentString:"", isCoppaCompliant:false, isTestModeEnabled:true, isDebugModeEnabled:true);
Debug.Log("Start Initializing the Azerion Ads SDK");
AzerionAds.Initialize(HandleInitCompleteAction, settings);
}
private void HandleInitCompleteAction(InitializationStatus initializationStatus)
{
foreach (KeyValuePair<string, AdapterStatus> adapterStateEntry in initializationStatus.getAdapterStatusMap())
{
Debug.Log("AdapterName: " + adapterStateEntry.Value.Name + " AdapterStatus: " +
adapterStateEntry.Value.InitializationState);
}
}
...
}
NOTE
You can only request Ad after SDK successfully finished initialization.
Banner Ad
public class AzerionAdsController : MonoBehaviour
{
private BannerAd _bannerAd;
...
private void RequestBannerAd()
{
var adUnitId = "22358747";
_bannerAd?.Destroy();
_bannerAd = new BannerAd(adUnitId, AdSize.BANNER, AdPosition.Bottom);
_bannerAd.OnAdLoaded += (sender, args) =>
{
Debug.Log("Ad Loaded");
_bannerAd?.Show();
};
_bannerAd.OnAdFailedToLoad += (sender, args) =>
{
Debug.Log("errorCode: " + args.ErrorCode + " message: " + args.Message + " errorContext: " +
args.ErrorContext);
};
_bannerAd.OnAdClosed += (sender, args) => { Debug.Log("OnAdClosed"); };
_bannerAd.OnAdDisplayed += (sender, args) => { Debug.Log("Ad Displayed"); };
_bannerAd.OnAdFailedToDisplay += (sender, args) =>
{
Debug.Log("errorCode: " + args.ErrorCode + " message: " + args.Message + " errorContext: " +
args.ErrorContext);
};
_bannerAd.OnAdHide += (sender, args) => { Debug.Log("OnAdHide"); };
_bannerAd.OnAdLeftApplication += (sender, args) => { Debug.Log("OnAdLeavingApplication"); };
_bannerAd.LoadAd();
}
...
}
Interstitial Ad
public class AzerionAdsController : MonoBehaviour
{
private InterstitialAd _interstitialAd;
...
private void RequestInterstitial()
{
if (_interstitialAd == null)
{
string adUnitId = "22371036";
_interstitialAd = new InterstitialAd(adUnitId);
_interstitialAd.OnAdLoaded += (sender, args) =>
{
Debug.Log("_interstitialAd Loaded");
};
_interstitialAd.OnAdFailedToLoad += (sender, args) =>
{
Debug.Log("errorCode: " + args.ErrorCode + " message: " + args.Message + " errorContext: " +
args.ErrorContext);
RequestInterstitial();
};
_interstitialAd.OnAdClosed += (sender, args) =>
{
Debug.Log("OnAdClosed");
RequestInterstitial();
};
_interstitialAd.OnAdDisplayed += (sender, args) =>
{
Debug.Log("Ad Displayed");
};
_interstitialAd.OnAdFailedToDisplay += (sender, args) =>
{
Debug.Log("errorCode: " + args.ErrorCode + " message: " + args.Message + " errorContext: " +
args.ErrorContext);
RequestInterstitial();
};
_interstitialAd.OnAdLeavingApplication += (sender, args) => { Debug.Log("OnAdLeavingApplication"); };
}
Debug.Log("Loading Interstitial Ad");
_interstitialAd.Load();
}
...
}
Destroy the interstitial ad when you no longer needed it.
_interstitialAd?.Destroy();
_interstitialAd = null;
Rewarded Ad
public class AzerionAdsController : MonoBehaviour
{
private RewardedAd _rewardedAd;
...
private void RequestRewardVideo()
{
string adUnityId = "22328044";
if (_rewardedAd == null)
{
_rewardedAd = new RewardedAd(adUnityId);
_rewardedAd.OnAdLoaded += (sender, args) =>
{
Debug.Log("Ad Loaded");
};
_rewardedAd.OnAdFailedToLoad += (sender, args) =>
{
Debug.Log("errorCode: " + args.ErrorCode + " message: " + args.Message + " errorContext: " +
args.ErrorContext);
RequestRewardVideo();
};
_rewardedAd.OnAdClosed += (sender, args) =>
{
Debug.Log("OnAdClosed");
RequestRewardVideo();
};
_rewardedAd.OnAdDisplayed += (sender, args) => {
Debug.Log("Ad Displayed");
};
_rewardedAd.OnAdFailedToDisplay += (sender, args) =>
{
Debug.Log("errorCode: " + args.ErrorCode + " message: " + args.Message + " errorContext: " +
args.ErrorContext);
RequestRewardVideo();
};
_rewardedAd.OnAdLeavingApplication += (sender, args) => { Debug.Log("OnAdLeavingApplication"); };
_rewardedAd.OnUserRewardEarned += (sender, args) =>
{
if (args != null)
{
Debug.Log("OnUserRewardEarned reward amount: " + args.Amount);
}
else
{
Debug.Log("OnUserRewardEarned");
}
OnUserRewardEarned(args);
};
}
_rewardedAd.Load();
}
...
}
Destroy the rewarded ad when you no longer needed it.
_rewardedAd?.Destroy();
_rewardedAd = null;
AdMob FullScreen Ad Scaling Issue on Android
If you use the following resolution and presentation
setting in your game then you may face the above problem, because
by default AdMob use Translucent
theme for it's AdActivity
which allow see through.
To solve this problem you have to override the Translucent
behaviour of the AdActivity
Here are the steps you need to follow
<manifest package="com.unity3d.player" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
...
<application>
...
<activity
android:name="com.google.android.gms.ads.AdActivity"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
tools:replace="android:theme"/>
..
</application>
</manifest>
Known android build issues and solution
-
If you are targeting android api level 30 you may face the following issue
AAPT: error: resource android:attr/lStar not found.
To solve this issue add launcherTemplate.gradle
from Project Settings -> Publishing Settings -> Custom Launcher Gradle Template
Add the following configuration into launcherTemplate.gradle
...
configurations.all {
resolutionStrategy {
force 'androidx.core:core:1.6.0'
}
}
-
Kotlin module issue
More than one file was found with OS independent path 'META-INF/annotation-experimental_release.kotlin_module'
Please add the following config into launcherTemplate.gradle
android {
...
packagingOptions {
exclude("META-INF/*.kotlin_module")
}
...
}
-
If you are using firebase-analytics
please update it version to 21.0.0