2026-04-20 13:49:36 +08:00
//
// AppLovinAutoUpdater.cs
// AppLovin MAX Unity Plugin
//
// Created by Santosh Bagadi on 1/27/20.
// Copyright © 2020 AppLovin. All rights reserved.
//
using System ;
using System.Collections.Generic ;
using System.Linq ;
using UnityEditor ;
namespace AppLovinMax.Scripts.IntegrationManager.Editor
{
/// <summary>
/// Handles auto updates for AppLovin MAX plugin.
/// </summary>
2026-05-08 11:03:00 +08:00
public static class AppLovinAutoUpdater
2026-04-20 13:49:36 +08:00
{
public const string KeyAutoUpdateEnabled = "com.applovin.auto_update_enabled" ;
private const string KeyLastUpdateCheckTime = "com.applovin.last_update_check_time_v2" ; // Updated to v2 to force adapter version checks in plugin version 3.1.10.
private static readonly DateTime EpochTime = new DateTime ( 1970 , 1 , 1 , 0 , 0 , 0 , DateTimeKind . Utc );
private static readonly int SecondsInADay = ( int ) TimeSpan . FromDays ( 1 ). TotalSeconds ;
// TODO: Make this list dynamic.
public static readonly Dictionary < string , string > MinAdapterVersions = new Dictionary < string , string >()
{
{ "ADMOB_NETWORK" , "android_23.3.0.1_ios_11.9.0.1" },
{ "BIDMACHINE_NETWORK" , "android_3.0.1.1_ios_3.0.0.0.1" },
{ "CHARTBOOST_NETWORK" , "android_9.7.0.3_ios_9.7.0.2" },
{ "FACEBOOK_MEDIATE" , "android_6.17.0.1_ios_6.15.2.1" },
{ "FYBER_NETWORK" , "android_8.3.1.1_ios_8.3.2.1" },
{ "GOOGLE_AD_MANAGER_NETWORK" , "android_23.3.0.1_ios_11.9.0.1" },
{ "HYPRMX_NETWORK" , "android_6.4.2.1_ios_6.4.1.0.1" },
{ "INMOBI_NETWORK" , "android_10.7.7.1_ios_10.7.5.1" },
{ "IRONSOURCE_NETWORK" , "android_8.3.0.0.2_ios_8.3.0.0.1" },
{ "LINE_NETWORK" , "android_2024.8.27.1_ios_2.8.20240827.1" },
{ "MINTEGRAL_NETWORK" , "android_16.8.51.1_ios_7.7.2.0.1" },
{ "MOBILEFUSE_NETWORK" , "android_1.7.6.1_ios_1.7.6.1" },
{ "MOLOCO_NETWORK" , "android_3.1.0.1_ios_3.1.3.1" },
{ "MYTARGET_NETWORK" , "android_5.22.1.1_ios_5.21.7.1" },
{ "PUBMATIC_NETWORK" , "android_3.9.0.2_ios_3.9.0.2" },
{ "SMAATO_NETWORK" , "android_22.7.0.1_ios_22.8.4.1" },
{ "TIKTOK_NETWORK" , "android_6.2.0.5.2_ios_6.2.0.7.2" },
{ "UNITY_NETWORK" , "android_4.12.2.1_ios_4.12.2.1" },
{ "VERVE_NETWORK" , "android_3.0.4.1_ios_3.0.4.1" },
{ "VUNGLE_NETWORK" , "android_7.4.1.1_ios_7.4.1.1" },
{ "YANDEX_NETWORK" , "android_7.4.0.1_ios_2.18.0.1" },
};
/// <summary>
/// Checks if a new version of the plugin is available and prompts the user to update if one is available.
/// </summary>
public static void Update ()
{
var now = ( int ) ( DateTime . UtcNow - EpochTime ). TotalSeconds ;
if ( EditorPrefs . HasKey ( KeyLastUpdateCheckTime ))
{
var elapsedTime = now - EditorPrefs . GetInt ( KeyLastUpdateCheckTime );
// Check if we have checked for a new version in the last 24 hrs and skip update if we have.
if ( elapsedTime < SecondsInADay ) return ;
}
// Update last checked time.
EditorPrefs . SetInt ( KeyLastUpdateCheckTime , now );
// Load the plugin data
AppLovinEditorCoroutine . StartCoroutine ( AppLovinIntegrationManager . Instance . LoadPluginData ( data =>
{
if ( data == null ) return ;
ShowPluginUpdateDialogIfNeeded ( data );
ShowNetworkAdaptersUpdateDialogIfNeeded ( data . MediatedNetworks );
ShowGoogleNetworkAdaptersUpdateDialogIfNeeded ( data . MediatedNetworks );
}));
}
private static void ShowPluginUpdateDialogIfNeeded ( PluginData data )
{
// Check if publisher has disabled auto update.
if (! EditorPrefs . GetBool ( KeyAutoUpdateEnabled , true )) return ;
// Check if the current and latest version are the same or if the publisher is on a newer version (on beta). If so, skip update.
var comparison = data . AppLovinMax . CurrentToLatestVersionComparisonResult ;
if ( comparison == MaxSdkUtils . VersionComparisonResult . Equal || comparison == MaxSdkUtils . VersionComparisonResult . Greater ) return ;
// A new version of the plugin is available. Show a dialog to the publisher.
var option = EditorUtility . DisplayDialogComplex (
"AppLovin MAX Plugin Update" ,
"A new version of AppLovin MAX plugin is available for download. Update now?" ,
"Download" ,
"Not Now" ,
"Don't Ask Again" );
if ( option == 0 ) // Download
{
MaxSdkLogger . UserDebug ( "Downloading plugin..." );
AppLovinEditorCoroutine . StartCoroutine ( AppLovinIntegrationManager . Instance . DownloadPlugin ( data . AppLovinMax ));
}
else if ( option == 1 ) // Not Now
{
// Do nothing
MaxSdkLogger . UserDebug ( "Update postponed." );
}
else if ( option == 2 ) // Don't Ask Again
{
MaxSdkLogger . UserDebug ( "Auto Update disabled. You can enable it again from the AppLovin Integration Manager" );
EditorPrefs . SetBool ( KeyAutoUpdateEnabled , false );
}
}
private static void ShowNetworkAdaptersUpdateDialogIfNeeded ( Network [] networks )
{
var networksToUpdate = networks . Where ( network => network . RequiresUpdate ). ToList ();
// If all networks are above the required version, do nothing.
if ( networksToUpdate . Count <= 0 ) return ;
// We found a few adapters that are not compatible with the current SDK, show alert.
var message = "The following network adapters are not compatible with the current version of AppLovin MAX Plugin:\n" ;
foreach ( var networkName in networksToUpdate )
{
message += "\n- " ;
message += networkName . DisplayName + " (Requires " + MinAdapterVersions [ networkName . Name ] + " or newer)" ;
}
message += "\n\nPlease update them to the latest versions to avoid any issues." ;
AppLovinIntegrationManager . ShowBuildFailureDialog ( message );
}
private static void ShowGoogleNetworkAdaptersUpdateDialogIfNeeded ( Network [] networks )
{
// AdMob and GAM use the same SDKs so their adapters should use the same underlying SDK version.
var googleNetwork = networks . FirstOrDefault ( network => network . Name . Equals ( "ADMOB_NETWORK" ));
var googleAdManagerNetwork = networks . FirstOrDefault ( network => network . Name . Equals ( "GOOGLE_AD_MANAGER_NETWORK" ));
// If both AdMob and GAM are not integrated, do nothing.
if ( googleNetwork == null || string . IsNullOrEmpty ( googleNetwork . CurrentVersions . Unity ) ||
googleAdManagerNetwork == null || string . IsNullOrEmpty ( googleAdManagerNetwork . CurrentVersions . Unity )) return ;
var isAndroidVersionCompatible = GoogleNetworkAdaptersCompatible ( googleNetwork . CurrentVersions . Android , googleAdManagerNetwork . CurrentVersions . Android , "19.8.0.0" );
var isIosVersionCompatible = GoogleNetworkAdaptersCompatible ( googleNetwork . CurrentVersions . Ios , googleAdManagerNetwork . CurrentVersions . Ios , "8.0.0.0" );
if ( isAndroidVersionCompatible && isIosVersionCompatible ) return ;
var message = "You may see unexpected errors if you use different versions of the AdMob and Google Ad Manager adapter SDKs. " +
"AdMob and Google Ad Manager share the same SDKs.\n\n" +
"You can be sure that you are using the same SDK for both if the first three numbers in each adapter version match." ;
AppLovinIntegrationManager . ShowBuildFailureDialog ( message );
}
private static bool GoogleNetworkAdaptersCompatible ( string googleVersion , string googleAdManagerVersion , string breakingVersion )
{
var googleResult = MaxSdkUtils . CompareVersions ( googleVersion , breakingVersion );
var googleAdManagerResult = MaxSdkUtils . CompareVersions ( googleAdManagerVersion , breakingVersion );
// If one is less than the breaking version and the other is not, they are not compatible.
if ( googleResult == MaxSdkUtils . VersionComparisonResult . Lesser &&
googleAdManagerResult != MaxSdkUtils . VersionComparisonResult . Lesser ) return false ;
if ( googleAdManagerResult == MaxSdkUtils . VersionComparisonResult . Lesser &&
googleResult != MaxSdkUtils . VersionComparisonResult . Lesser ) return false ;
return true ;
}
}
}